[Add] Nicer collision mesh viewing in model viewer.

This commit is contained in:
Allanis 2018-02-03 20:37:32 +00:00
parent ebe013984f
commit 1a62fd07f7

View File

@ -9,6 +9,7 @@ static int g_mouseMotion[2];
static char g_keyState[SDLK_LAST];
static int g_mouseButton[5];
static int g_model = 0; /* sbre model number. Set with argc. */
static float g_zbias;
static void PollEvents(void) {
@ -127,6 +128,30 @@ public:
void MainLoop();
};
static void render_coll_mesh(const CollMesh* m) {
glDisable(GL_LIGHTING);
glColor3f(1, 0, 1);
glBegin(GL_TRIANGLES);
glDepthRange(0.0+g_zbias, 1.0);
for(int i = 0; i < m->ni; i += 3) {
glVertex3fv(&m->pVertex[3*m->pIndex[i+1]]);
glVertex3fv(&m->pVertex[3*m->pIndex[i]]);
glVertex3fv(&m->pVertex[3*m->pIndex[i+2]]);
}
glEnd();
glColor3f(1, 1, 1);
glDepthRange(0, 1.0f-g_zbias);
for(int i = 0; i < m->ni; i += 3) {
glBegin(GL_LINE_LOOP);
glVertex3fv(&m->pVertex[3*m->pIndex[i]]);
glVertex3fv(&m->pVertex[3*m->pIndex[i+1]]);
glVertex3fv(&m->pVertex[3*m->pIndex[i+2]]);
glEnd();
}
glDepthRange(0, 1);
glEnable(GL_LIGHTING);
}
void Viewer::MainLoop(void) {
matrix4x4d rot = matrix4x4d::Identity();
float distance = 100;
@ -171,7 +196,14 @@ void Viewer::MainLoop(void) {
m.y1 = rot[1]; m.y2 = rot[5]; m.y3 = rot[ 9];
m.z1 = rot[2]; m.z2 = rot[6]; m.z3 = rot[10];
p.x = 0; p.y = 0; p.z = distance;
if(g_renderCollMesh) sbreRenderCollMesh(cmesh, &p, &m);
if(g_renderCollMesh) {
glPushMatrix();
glTranslatef(p.x, p.y, p.z);
glMultMatrixd(&rot[0]);
render_coll_mesh(cmesh);
glPopMatrix();
//sbreRenderCollMesh(cmesh, &p, &m);
}
else sbreRenderModel(&p, &m, g_model, &params);
glPopAttrib();
@ -212,7 +244,8 @@ int main(int argc, char** argv) {
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
sbreSetZBias(2.0/(1<<24));
g_zbias = 2.0/(1<<24);
sbreSetZBias(g_zbias);
Uint32 flags = SDL_OPENGL;
@ -222,7 +255,8 @@ int main(int argc, char** argv) {
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 6);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
sbreSetZBias(2.0/(1<<16));
g_zbias = 2.0/(1<<16);
sbreSetZBias(g_zbias);
fprintf(stderr, "Failed to set video mode. (%s). Re-trying with 16-bit depth buffer.\n", SDL_GetError());
if((g_screen = SDL_SetVideoMode(g_width, g_height, info->vfmt->BitsPerPixel, flags)) == 0) {
fprintf(stderr, "Video mode set failed: %s\n", SDL_GetError());