void FMD3Model::RenderTriangles(MD3Surface * surf, MD3Vertex * vert, Matrix3x4 *modeltoworld) { gl_ApplyShader(); gl.Begin(GL_TRIANGLES); for(int i=0; i<surf->numTriangles;i++) { for(int j=0;j<3;j++) { int x = surf->tris[i].VertIndex[j]; gl.TexCoord2fv(&surf->texcoords[x].s); if (modeltoworld == NULL) { gl.Vertex3f(vert[x].x, vert[x].z, vert[x].y); } else { Vector v = *modeltoworld * Vector(vert[x].x, vert[x].z, vert[x].y); gl.Vertex3fv(&v[0]); } } } gl.End(); }
//========================================================================== // // Draw the plane segment into the gap // //========================================================================== void GLDrawInfo::DrawFloodedPlane(wallseg * ws, float planez, sector_t * sec, bool ceiling) { GLSectorPlane plane; int lightlevel; FColormap Colormap; FGLTexture * gltexture; plane.GetFromSector(sec, ceiling); gltexture=FGLTexture::ValidateTexture(plane.texture); if (!gltexture) return; if (gl_fixedcolormap) { Colormap.GetFixedColormap(); lightlevel=255; } else { Colormap=sec->ColorMap; if (gltexture->tex->isFullbright()) { Colormap.LightColor.r = Colormap.LightColor.g = Colormap.LightColor.b = 0xff; lightlevel=255; } else lightlevel=abs(ceiling? GetCeilingLight(sec) : GetFloorLight(sec)); } int rel = extralight * gl_weaponlight; gl_SetColor(lightlevel, rel, &Colormap, 1.0f); gl_SetFog(lightlevel, rel, &Colormap, false); gltexture->Bind(Colormap.LightColor.a); gl_SetPlaneTextureRotation(&plane, gltexture); float fviewx = TO_GL(viewx); float fviewy = TO_GL(viewy); float fviewz = TO_GL(viewz); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); float prj_fac1 = (planez-fviewz)/(ws->z1-fviewz); float prj_fac2 = (planez-fviewz)/(ws->z2-fviewz); float px1 = fviewx + prj_fac1 * (ws->x1-fviewx); float py1 = fviewy + prj_fac1 * (ws->y1-fviewy); float px2 = fviewx + prj_fac2 * (ws->x1-fviewx); float py2 = fviewy + prj_fac2 * (ws->y1-fviewy); float px3 = fviewx + prj_fac2 * (ws->x2-fviewx); float py3 = fviewy + prj_fac2 * (ws->y2-fviewy); float px4 = fviewx + prj_fac1 * (ws->x2-fviewx); float py4 = fviewy + prj_fac1 * (ws->y2-fviewy); gl.TexCoord2f(px1 / 64, -py1 / 64); gl.Vertex3f(px1, planez, py1); gl.TexCoord2f(px2 / 64, -py2 / 64); gl.Vertex3f(px2, planez, py2); gl.TexCoord2f(px3 / 64, -py3 / 64); gl.Vertex3f(px3, planez, py3); gl.TexCoord2f(px4 / 64, -py4 / 64); gl.Vertex3f(px4, planez, py4); gl.End(); gl.MatrixMode(GL_TEXTURE); gl.PopMatrix(); gl.MatrixMode(GL_MODELVIEW); }
static void RenderBox(FTextureID texno, FGLTexture * gltex, float x_offset, int CM_Index) { FSkyBox * sb = static_cast<FSkyBox*>(gltex->tex); int faces; FGLTexture * tex; gl.Rotatef(-180.0f+x_offset, glset.skyrotatevector.X, glset.skyrotatevector.Z, glset.skyrotatevector.Y); gl.Color3f(R, G ,B); if (sb->faces[5]) { faces=4; // north tex = FGLTexture::ValidateTexture(sb->faces[0]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, 128.f, -128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(-128.f, -128.f, -128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, -128.f, -128.f); gl.End(); // east tex = FGLTexture::ValidateTexture(sb->faces[1]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(-128.f, -128.f, 128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(-128.f, -128.f, -128.f); gl.End(); // south tex = FGLTexture::ValidateTexture(sb->faces[2]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(128.f, 128.f, 128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(128.f, -128.f, 128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(-128.f, -128.f, 128.f); gl.End(); // west tex = FGLTexture::ValidateTexture(sb->faces[3]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, 128.f, 128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(128.f, 128.f, -128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(128.f, -128.f, -128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, -128.f, 128.f); gl.End(); } else { faces=1; // all 4 sides tex = FGLTexture::ValidateTexture(sb->faces[0]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, 128.f, -128.f); gl.TexCoord2f(.25f, 0); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(.25f, 1); gl.Vertex3f(-128.f, -128.f, -128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, -128.f, -128.f); gl.End(); // east gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(.25f, 0); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(.5f, 0); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(.5f, 1); gl.Vertex3f(-128.f, -128.f, 128.f); gl.TexCoord2f(.25f, 1); gl.Vertex3f(-128.f, -128.f, -128.f); gl.End(); // south gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(.5f, 0); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(.75f, 0); gl.Vertex3f(128.f, 128.f, 128.f); gl.TexCoord2f(.75f, 1); gl.Vertex3f(128.f, -128.f, 128.f); gl.TexCoord2f(.5f, 1); gl.Vertex3f(-128.f, -128.f, 128.f); gl.End(); // west gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(.75f, 0); gl.Vertex3f(128.f, 128.f, 128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(128.f, 128.f, -128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(128.f, -128.f, -128.f); gl.TexCoord2f(.75f, 1); gl.Vertex3f(128.f, -128.f, 128.f); gl.End(); } // top tex = FGLTexture::ValidateTexture(sb->faces[faces]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); if (!sb->fliptop) { gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, 128.f, -128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, 128.f, 128.f); } else { gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, 128.f, 128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(-128.f, 128.f, 128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(-128.f, 128.f, -128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, 128.f, -128.f); } gl.End(); // bottom tex = FGLTexture::ValidateTexture(sb->faces[faces+1]); tex->BindPatch(CM_Index, 0); gl_ApplyShader(); gl.Begin(GL_TRIANGLE_FAN); gl.TexCoord2f(0, 0); gl.Vertex3f(128.f, -128.f, -128.f); gl.TexCoord2f(1, 0); gl.Vertex3f(-128.f, -128.f, -128.f); gl.TexCoord2f(1, 1); gl.Vertex3f(-128.f, -128.f, 128.f); gl.TexCoord2f(0, 1); gl.Vertex3f(128.f, -128.f, 128.f); gl.End(); }
static void RenderSkyHemisphere(int hemi) { int r, c; if (hemi & SKYHEMI_LOWER) { yflip = true; } else { yflip = false; } // The top row (row 0) is the one that's faded out. // There must be at least 4 columns. The preferable number // is 4n, where n is 1, 2, 3... There should be at least // two rows because the first one is always faded. rows = 4; if (hemi & SKYHEMI_JUST_CAP) { return; } gl_DisableShader(); // Draw the cap as one solid color polygon if (!foglayer) { columns = 4 * (gl_sky_detail > 0 ? gl_sky_detail : 1); foglayer=true; gl_EnableTexture(false); if (!secondlayer) { gl.Color3f(R, G ,B); gl.Begin(GL_TRIANGLE_FAN); for(c = 0; c < columns; c++) { SkyVertex(1, c); } gl.End(); } gl_EnableTexture(true); foglayer=false; gl_ApplyShader(); } else { columns=4; // no need to do more! gl.Begin(GL_TRIANGLE_FAN); for(c = 0; c < columns; c++) { SkyVertex(0, c); } gl.End(); } // The total number of triangles per hemisphere can be calculated // as follows: rows * columns * 2 + 2 (for the top cap). for(r = 0; r < rows; r++) { if (yflip) { gl.Begin(GL_TRIANGLE_STRIP); SkyVertex(r + 1, 0); SkyVertex(r, 0); for(c = 1; c <= columns; c++) { SkyVertex(r + 1, c); SkyVertex(r, c); } gl.End(); } else { gl.Begin(GL_TRIANGLE_STRIP); SkyVertex(r, 0); SkyVertex(r + 1, 0); for(c = 1; c <= columns; c++) { SkyVertex(r, c); SkyVertex(r + 1, c); } gl.End(); } } }