diff options
Diffstat (limited to 'sdl/pyramid.c')
-rw-r--r-- | sdl/pyramid.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/sdl/pyramid.c b/sdl/pyramid.c index ff8a03f..316abe5 100644 --- a/sdl/pyramid.c +++ b/sdl/pyramid.c @@ -1,18 +1,11 @@ /* pyramid.c * - * @2011 Kamil Kaminski + * Kamil Kaminski + * kkaminsk.com * - * notes: since lighting is enabled, we need to specify normals for - * each polygon face so the OpenGL can calculate e.g. how light reflects + * Textured Pyramid, + * running on a homebrew framework * - * drawing a shadow for the pyramid would require drawing things twice, so on 2nd - * pass we would draw with black color and multiply by squished matrix, we should - * get to this later with better approach - * - * so far we have been using immediate mode rendering, we should begin using - * display lists / batch processing to reduce overhead, aka compiling commands - * - * it might be time to split the code, and make a shader version... * */ @@ -54,8 +47,9 @@ static int client_init(struct client *p) p->textures[1] = gltLoadTGATexture("grass.tga"); /* display list, precompile commands */ - p->ground_list = glGenLists(2); + p->ground_list = glGenLists(3); p->triangle_list = p->ground_list + 1; + p->figures_list = p->ground_list + 2; /* a triangle with a texture */ glNewList(p->triangle_list, GL_COMPILE); @@ -71,13 +65,22 @@ static int client_init(struct client *p) glDrawGround(); glEndList(); + /* figures */ + glNewList(p->figures_list, GL_COMPILE); + glDisable(GL_LIGHTING); + glDisable(GL_TEXTURE_2D); + glDrawFigures(); + glEnable(GL_LIGHTING); + glEnable(GL_TEXTURE_2D); + glEndList(); + return 0; } static int client_destroy(struct client *p) { glDeleteTextures(2, p->textures); - glDeleteLists(p->ground_list, 2); + glDeleteLists(p->ground_list, 3); return 0; } @@ -95,25 +98,36 @@ static void render(struct platform *p) /* save the matrix state and do the rotations */ glPushMatrix(); /* apply camera transform, and draw the ground */ - glframe_apply_camera_transform(&p->camera, 1); + glframe_apply_camera_transform(&p->camera, 0); glCallList(p->c->ground_list); glPushMatrix(); - /* move object back and do in place rotation */ - glTranslatef(0.0f, 0.2f, -3.5f); - glRotatef(p->c->xrot, 1.0f, 0.0f, 0.0f); - glRotatef(p->c->yrot, 0.0f, 1.0f, 0.0f); + /* move object back and do in place rotation */ + glTranslatef(0.0f, 0.2f, -3.5f); + glRotatef(p->c->xrot, 1.0f, 0.0f, 0.0f); + glRotatef(p->c->yrot, 0.0f, 1.0f, 0.0f); - /* draw the pyramid */ - glCallList(p->c->triangle_list); + /* draw the pyramid */ + glCallList(p->c->triangle_list); glPopMatrix(); - /* draw a snowman */ - glTranslatef(0.0f, 0.0f, -7.0f); + glPushMatrix(); + /* draw a snowman */ + glDisable(GL_TEXTURE_2D); + int i; + for (i = 0; i < 3; i++) + { + glTranslatef(0.0f, 0.0f, -6.0f); + glDrawSnowman(); + } + glEnable(GL_TEXTURE_2D); + glPopMatrix(); - glDisable(GL_TEXTURE_2D); - glDrawSnowman(); - glEnable(GL_TEXTURE_2D); + glPushMatrix(); + /* draw figures */ + glTranslatef(0.0f, 4.0f, 0.0f); + glCallList(p->c->figures_list); + glPopMatrix(); /* restore the matrix state */ glPopMatrix(); @@ -124,6 +138,8 @@ static void render(struct platform *p) int main(int argc, char **argv) { + glutInit(&argc, argv); + struct platform p; memset(&p, 0, sizeof(p)); |