mirror of
https://github.com/bulletphysics/bullet3
synced 2024-12-14 13:50:04 +00:00
256 lines
6.0 KiB
C++
256 lines
6.0 KiB
C++
#include "SimpleOpenGL2App.h"
|
|
#include "OpenGLInclude.h"
|
|
|
|
#include "Bullet3Common/b3Logging.h"//b3Assert?
|
|
#include "Bullet3Common/b3Scalar.h"
|
|
#include "Bullet3Common/b3AlignedObjectArray.h"
|
|
#include "Bullet3Common/b3Vector3.h"
|
|
|
|
|
|
#include "stdlib.h"
|
|
|
|
#ifdef __APPLE__
|
|
#include "MacOpenGLWindow.h"
|
|
#else
|
|
|
|
|
|
//#include "GL/glew.h"
|
|
#ifdef _WIN32
|
|
#include "Win32OpenGLWindow.h"
|
|
#else
|
|
//let's cross the fingers it is Linux/X11
|
|
#include "X11OpenGLWindow.h"
|
|
#endif //_WIN32
|
|
#endif//__APPLE__
|
|
#include <stdio.h>
|
|
#include "../CommonInterfaces/CommonRenderInterface.h"
|
|
|
|
static SimpleOpenGL2App* gApp2=0;
|
|
|
|
static void Simple2ResizeCallback( float widthf, float heightf)
|
|
{
|
|
int width = (int)widthf;
|
|
int height = (int)heightf;
|
|
if (gApp2->m_renderer)
|
|
gApp2->m_renderer->resize(width,height);
|
|
//gApp2->m_renderer->setScreenSize(width,height);
|
|
|
|
}
|
|
|
|
static void Simple2KeyboardCallback(int key, int state)
|
|
{
|
|
if (key==B3G_ESCAPE && gApp2 && gApp2->m_window)
|
|
{
|
|
gApp2->m_window->setRequestExit();
|
|
} else
|
|
{
|
|
//gApp2->defaultKeyboardCallback(key,state);
|
|
}
|
|
}
|
|
|
|
void Simple2MouseButtonCallback( int button, int state, float x, float y)
|
|
{
|
|
gApp2->defaultMouseButtonCallback(button,state,x,y);
|
|
}
|
|
void Simple2MouseMoveCallback( float x, float y)
|
|
{
|
|
gApp2->defaultMouseMoveCallback(x,y);
|
|
}
|
|
|
|
void Simple2WheelCallback( float deltax, float deltay)
|
|
{
|
|
gApp2->defaultWheelCallback(deltax,deltay);
|
|
}
|
|
|
|
|
|
|
|
|
|
struct SimpleOpenGL2AppInternalData
|
|
{
|
|
|
|
};
|
|
|
|
SimpleOpenGL2App::SimpleOpenGL2App(const char* title, int width, int height)
|
|
{
|
|
gApp2 = this;
|
|
m_data = new SimpleOpenGL2AppInternalData;
|
|
|
|
m_window = new b3gDefaultOpenGLWindow();
|
|
b3gWindowConstructionInfo ci;
|
|
ci.m_title = title;
|
|
ci.m_openglVersion = 2;
|
|
ci.m_width = width;
|
|
ci.m_height = height;
|
|
m_window->createWindow(ci);
|
|
|
|
m_window->setWindowTitle(title);
|
|
|
|
#ifndef __APPLE__
|
|
#ifndef _WIN32
|
|
//some Linux implementations need the 'glewExperimental' to be true
|
|
glewExperimental = GL_TRUE;
|
|
#endif
|
|
|
|
|
|
if (glewInit() != GLEW_OK)
|
|
{
|
|
b3Error("glewInit failed");
|
|
exit(1);
|
|
}
|
|
if (!GLEW_VERSION_2_1) // check that the machine supports the 2.1 API.
|
|
{
|
|
b3Error("GLEW_VERSION_2_1 needs to support 2_1");
|
|
exit(1); // or handle the error in a nicer way
|
|
}
|
|
|
|
#endif
|
|
glGetError();//don't remove this call, it is needed for Ubuntu
|
|
glClearColor(0.9,0.9,1,1);
|
|
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
|
|
//m_primRenderer = new GLPrimitiveRenderer(width,height);
|
|
m_parameterInterface = 0;
|
|
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
|
|
//m_instancingRenderer = new GLInstancingRenderer(128*1024,32*1024*1024);
|
|
//m_instancingRenderer->init();
|
|
//m_instancingRenderer->resize(width,height);
|
|
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
|
|
//m_instancingRenderer->InitShaders();
|
|
|
|
m_window->setMouseMoveCallback(Simple2MouseMoveCallback);
|
|
m_window->setMouseButtonCallback(Simple2MouseButtonCallback);
|
|
m_window->setKeyboardCallback(Simple2KeyboardCallback);
|
|
m_window->setWheelCallback(Simple2WheelCallback);
|
|
m_window->setResizeCallback(Simple2ResizeCallback);
|
|
|
|
}
|
|
|
|
SimpleOpenGL2App::~SimpleOpenGL2App()
|
|
{
|
|
gApp2 = 0;
|
|
delete m_data;
|
|
}
|
|
|
|
void SimpleOpenGL2App::drawGrid(DrawGridData data)
|
|
{
|
|
int gridSize = data.gridSize;
|
|
float upOffset = data.upOffset;
|
|
int upAxis = data.upAxis;
|
|
float gridColor[4];
|
|
gridColor[0] = data.gridColor[0];
|
|
gridColor[1] = data.gridColor[1];
|
|
gridColor[2] = data.gridColor[2];
|
|
gridColor[3] = data.gridColor[3];
|
|
|
|
int sideAxis=-1;
|
|
int forwardAxis=-1;
|
|
|
|
switch (upAxis)
|
|
{
|
|
case 1:
|
|
forwardAxis=2;
|
|
sideAxis=0;
|
|
break;
|
|
case 2:
|
|
forwardAxis=1;
|
|
sideAxis=0;
|
|
break;
|
|
default:
|
|
b3Assert(0);
|
|
};
|
|
//b3Vector3 gridColor = b3MakeVector3(0.5,0.5,0.5);
|
|
|
|
b3AlignedObjectArray<unsigned int> indices;
|
|
b3AlignedObjectArray<b3Vector3> vertices;
|
|
int lineIndex=0;
|
|
for(int i=-gridSize;i<=gridSize;i++)
|
|
{
|
|
{
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
b3Vector3 from = b3MakeVector3(0,0,0);
|
|
from[sideAxis] = float(i);
|
|
from[upAxis] = upOffset;
|
|
from[forwardAxis] = float(-gridSize);
|
|
b3Vector3 to=b3MakeVector3(0,0,0);
|
|
to[sideAxis] = float(i);
|
|
to[upAxis] = upOffset;
|
|
to[forwardAxis] = float(gridSize);
|
|
vertices.push_back(from);
|
|
indices.push_back(lineIndex++);
|
|
vertices.push_back(to);
|
|
indices.push_back(lineIndex++);
|
|
// m_renderer->drawLine(from,to,gridColor);
|
|
}
|
|
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
{
|
|
|
|
b3Assert(glGetError() ==GL_NO_ERROR);
|
|
b3Vector3 from=b3MakeVector3(0,0,0);
|
|
from[sideAxis] = float(-gridSize);
|
|
from[upAxis] = upOffset;
|
|
from[forwardAxis] = float(i);
|
|
b3Vector3 to=b3MakeVector3(0,0,0);
|
|
to[sideAxis] = float(gridSize);
|
|
to[upAxis] = upOffset;
|
|
to[forwardAxis] = float(i);
|
|
vertices.push_back(from);
|
|
indices.push_back(lineIndex++);
|
|
vertices.push_back(to);
|
|
indices.push_back(lineIndex++);
|
|
// m_renderer->drawLine(from,to,gridColor);
|
|
}
|
|
|
|
}
|
|
|
|
|
|
m_renderer->drawLines(&vertices[0].x,
|
|
gridColor,
|
|
vertices.size(),sizeof(b3Vector3),&indices[0],indices.size(),1);
|
|
|
|
|
|
m_renderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(1,0,0),b3MakeVector3(1,0,0),3);
|
|
m_renderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(0,1,0),b3MakeVector3(0,1,0),3);
|
|
m_renderer->drawLine(b3MakeVector3(0,0,0),b3MakeVector3(0,0,1),b3MakeVector3(0,0,1),3);
|
|
|
|
// void GLInstancingRenderer::drawPoints(const float* positions, const float color[4], int numPoints, int pointStrideInBytes, float pointDrawSize)
|
|
|
|
//we don't use drawPoints because all points would have the same color
|
|
// b3Vector3 points[3] = { b3MakeVector3(1, 0, 0), b3MakeVector3(0, 1, 0), b3MakeVector3(0, 0, 1) };
|
|
// m_instancingRenderer->drawPoints(&points[0].x, b3MakeVector3(1, 0, 0), 3, sizeof(b3Vector3), 6);
|
|
}
|
|
void SimpleOpenGL2App::setUpAxis(int axis)
|
|
{
|
|
}
|
|
int SimpleOpenGL2App::getUpAxis() const
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
void SimpleOpenGL2App::swapBuffer()
|
|
{
|
|
m_window->endRendering();
|
|
m_window->startRendering();
|
|
|
|
}
|
|
void SimpleOpenGL2App::drawText( const char* txt, int posX, int posY)
|
|
{
|
|
|
|
}
|
|
|
|
void SimpleOpenGL2App::drawText3D( const char* txt, float posX, float posZY, float posZ, float size)
|
|
{
|
|
|
|
}
|
|
|
|
void SimpleOpenGL2App::registerGrid(int xres, int yres, float color0[4], float color1[4])
|
|
{
|
|
|
|
}
|
|
|