| /**************************************************************************** |
| * |
| * Mesa 3-D graphics library |
| * Direct3D Driver Interface |
| * |
| * ======================================================================== |
| * |
| * Copyright (C) 1991-2004 SciTech Software, Inc. All rights reserved. |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * SCITECH SOFTWARE INC BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
| * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF |
| * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
| * SOFTWARE. |
| * |
| * ====================================================================== |
| * |
| * Language: ANSI C |
| * Environment: Windows 9x/2000/XP/XBox (Win32) |
| * |
| * Description: Primitive (points/lines/tris/quads) rendering |
| * |
| ****************************************************************************/ |
| |
| //#include "../GLDirect.h" |
| |
| //#include "gld_dx8.h" |
| |
| #include "dglcontext.h" |
| #include "ddlog.h" |
| #include "gld_dx8.h" |
| |
| #include "glheader.h" |
| #include "context.h" |
| #include "colormac.h" |
| #include "depth.h" |
| #include "extensions.h" |
| #include "macros.h" |
| #include "matrix.h" |
| // #include "mem.h" |
| //#include "mmath.h" |
| #include "mtypes.h" |
| #include "texformat.h" |
| #include "texstore.h" |
| #include "array_cache/acache.h" |
| #include "swrast/swrast.h" |
| #include "swrast_setup/swrast_setup.h" |
| #include "swrast_setup/ss_context.h" |
| #include "swrast/s_context.h" |
| #include "swrast/s_depth.h" |
| #include "swrast/s_lines.h" |
| #include "swrast/s_triangle.h" |
| #include "swrast/s_trispan.h" |
| #include "tnl/tnl.h" |
| #include "tnl/t_context.h" |
| #include "tnl/t_pipeline.h" |
| |
| // Disable compiler complaints about unreferenced local variables |
| #pragma warning (disable:4101) |
| |
| //--------------------------------------------------------------------------- |
| // Helper defines for primitives |
| //--------------------------------------------------------------------------- |
| |
| //static const float ooZ = 1.0f / 65536.0f; // One over Z |
| |
| #define GLD_COLOUR (D3DCOLOR_RGBA(swv->color[0], swv->color[1], swv->color[2], swv->color[3])) |
| #define GLD_SPECULAR (D3DCOLOR_RGBA(swv->specular[0], swv->specular[1], swv->specular[2], swv->specular[3])) |
| #define GLD_FLIP_Y(y) (gldCtx->dwHeight - (y)) |
| |
| //--------------------------------------------------------------------------- |
| // 2D vertex setup |
| //--------------------------------------------------------------------------- |
| |
| #define GLD_SETUP_2D_VARS_POINTS \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_2D_VERTEX *pV = (GLD_2D_VERTEX*)gld->PB2d.pPoints; \ |
| SScontext *ss = SWSETUP_CONTEXT(ctx); \ |
| SWvertex *swv; \ |
| DWORD dwSpecularColour; \ |
| DWORD dwFlatColour |
| |
| #define GLD_SETUP_2D_VARS_LINES \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_2D_VERTEX *pV = (GLD_2D_VERTEX*)gld->PB2d.pLines; \ |
| SScontext *ss = SWSETUP_CONTEXT(ctx); \ |
| SWvertex *swv; \ |
| DWORD dwSpecularColour; \ |
| DWORD dwFlatColour |
| |
| #define GLD_SETUP_2D_VARS_TRIANGLES \ |
| BOOL bFog = ctx->Fog.Enabled; \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_2D_VERTEX *pV = (GLD_2D_VERTEX*)gld->PB2d.pTriangles; \ |
| SScontext *ss = SWSETUP_CONTEXT(ctx); \ |
| SWvertex *swv; \ |
| DWORD dwSpecularColour; \ |
| DWORD dwFlatColour; \ |
| GLuint facing = 0; \ |
| struct vertex_buffer *VB; \ |
| GLchan (*vbcolor)[4]; \ |
| GLchan (*vbspec)[4] |
| |
| #define GLD_SETUP_GET_SWVERT(s) \ |
| swv = &ss->verts[##s] |
| |
| #define GLD_SETUP_2D_VERTEX \ |
| pV->x = swv->win[0]; \ |
| pV->y = GLD_FLIP_Y(swv->win[1]); \ |
| pV->rhw = swv->win[3] |
| |
| #define GLD_SETUP_SMOOTH_COLOUR \ |
| pV->diffuse = GLD_COLOUR |
| |
| #define GLD_SETUP_GET_FLAT_COLOUR \ |
| dwFlatColour = GLD_COLOUR |
| #define GLD_SETUP_GET_FLAT_FOG_COLOUR \ |
| dwFlatColour = _gldComputeFog(ctx, swv) |
| |
| #define GLD_SETUP_USE_FLAT_COLOUR \ |
| pV->diffuse = dwFlatColour |
| |
| #define GLD_SETUP_GET_FLAT_SPECULAR \ |
| dwSpecularColour= GLD_SPECULAR |
| |
| #define GLD_SETUP_USE_FLAT_SPECULAR \ |
| pV->specular = dwSpecularColour |
| |
| #define GLD_SETUP_DEPTH \ |
| pV->sz = swv->win[2] / ctx->DepthMaxF |
| // pV->z = swv->win[2] * ooZ; |
| |
| #define GLD_SETUP_SPECULAR \ |
| pV->specular = GLD_SPECULAR |
| |
| #define GLD_SETUP_FOG \ |
| pV->diffuse = _gldComputeFog(ctx, swv) |
| |
| #define GLD_SETUP_TEX0 \ |
| pV->t0_u = swv->texcoord[0][0]; \ |
| pV->t0_v = swv->texcoord[0][1] |
| |
| #define GLD_SETUP_TEX1 \ |
| pV->t1_u = swv->texcoord[1][0]; \ |
| pV->t1_v = swv->texcoord[1][1] |
| |
| #define GLD_SETUP_LIGHTING(v) \ |
| if (facing == 1) { \ |
| pV->diffuse = D3DCOLOR_RGBA(vbcolor[##v][0], vbcolor[##v][1], vbcolor[##v][2], vbcolor[##v][3]); \ |
| if (vbspec) { \ |
| pV->specular = D3DCOLOR_RGBA(vbspec[##v][0], vbspec[##v][1], vbspec[##v][2], vbspec[##v][3]); \ |
| } \ |
| } else { \ |
| if (bFog) \ |
| GLD_SETUP_FOG; \ |
| else \ |
| GLD_SETUP_SMOOTH_COLOUR; \ |
| GLD_SETUP_SPECULAR; \ |
| } |
| |
| #define GLD_SETUP_GET_FLAT_LIGHTING(v) \ |
| if (facing == 1) { \ |
| dwFlatColour = D3DCOLOR_RGBA(vbcolor[##v][0], vbcolor[##v][1], vbcolor[##v][2], vbcolor[##v][3]); \ |
| if (vbspec) { \ |
| dwSpecularColour = D3DCOLOR_RGBA(vbspec[##v][0], vbspec[##v][1], vbspec[##v][2], vbspec[##v][3]); \ |
| } \ |
| } |
| |
| #define GLD_SETUP_TWOSIDED_LIGHTING \ |
| /* Two-sided lighting */ \ |
| if (ctx->_TriangleCaps & DD_TRI_LIGHT_TWOSIDE) { \ |
| SWvertex *verts = SWSETUP_CONTEXT(ctx)->verts; \ |
| SWvertex *v[3]; \ |
| GLfloat ex,ey,fx,fy,cc; \ |
| /* Get vars for later */ \ |
| VB = &TNL_CONTEXT(ctx)->vb; \ |
| vbcolor = (GLchan (*)[4])VB->ColorPtr[1]->data; \ |
| if (VB->SecondaryColorPtr[1]) { \ |
| vbspec = (GLchan (*)[4])VB->SecondaryColorPtr[1]->data; \ |
| } else { \ |
| vbspec = NULL; \ |
| } \ |
| v[0] = &verts[v0]; \ |
| v[1] = &verts[v1]; \ |
| v[2] = &verts[v2]; \ |
| ex = v[0]->win[0] - v[2]->win[0]; \ |
| ey = v[0]->win[1] - v[2]->win[1]; \ |
| fx = v[1]->win[0] - v[2]->win[0]; \ |
| fy = v[1]->win[1] - v[2]->win[1]; \ |
| cc = ex*fy - ey*fx; \ |
| facing = (cc < 0.0) ^ ctx->Polygon._FrontBit; \ |
| } |
| |
| //--------------------------------------------------------------------------- |
| // 3D vertex setup |
| //--------------------------------------------------------------------------- |
| |
| #define GLD_SETUP_3D_VARS_POINTS \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_3D_VERTEX *pV = (GLD_3D_VERTEX*)gld->PB3d.pPoints; \ |
| TNLcontext *tnl = TNL_CONTEXT(ctx); \ |
| struct vertex_buffer *VB = &tnl->vb; \ |
| GLfloat (*p4f)[4]; \ |
| GLfloat (*tc)[4]; \ |
| DWORD dwColor; |
| |
| #define GLD_SETUP_3D_VARS_LINES \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_3D_VERTEX *pV = (GLD_3D_VERTEX*)gld->PB3d.pLines; \ |
| TNLcontext *tnl = TNL_CONTEXT(ctx); \ |
| struct vertex_buffer *VB = &tnl->vb; \ |
| GLfloat (*p4f)[4]; \ |
| GLfloat (*tc)[4]; \ |
| DWORD dwColor; |
| |
| #define GLD_SETUP_3D_VARS_TRIANGLES \ |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); \ |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); \ |
| GLD_3D_VERTEX *pV = (GLD_3D_VERTEX*)gld->PB3d.pTriangles; \ |
| TNLcontext *tnl = TNL_CONTEXT(ctx); \ |
| struct vertex_buffer *VB = &tnl->vb; \ |
| GLfloat (*p4f)[4]; \ |
| GLfloat (*tc)[4]; \ |
| DWORD dwColor; |
| |
| #define GLD_SETUP_3D_VERTEX(v) \ |
| p4f = VB->ObjPtr->data; \ |
| pV->Position.x = p4f[##v][0]; \ |
| pV->Position.y = p4f[##v][1]; \ |
| pV->Position.z = p4f[##v][2]; |
| |
| #define GLD_SETUP_SMOOTH_COLOUR_3D(v) \ |
| p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ |
| pV->Diffuse = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); |
| |
| |
| #define GLD_SETUP_GET_FLAT_COLOUR_3D(v) \ |
| p4f = (GLfloat (*)[4])VB->ColorPtr[0]->data; \ |
| dwColor = D3DCOLOR_COLORVALUE(p4f[##v][0], p4f[##v][1], p4f[##v][2], p4f[##v][3]); |
| |
| #define GLD_SETUP_USE_FLAT_COLOUR_3D \ |
| pV->Diffuse = dwColor; |
| |
| #define GLD_SETUP_TEX0_3D(v) \ |
| if (VB->TexCoordPtr[0]) { \ |
| tc = VB->TexCoordPtr[0]->data; \ |
| pV->TexUnit0.x = tc[##v][0]; \ |
| pV->TexUnit0.y = tc[##v][1]; \ |
| } |
| |
| #define GLD_SETUP_TEX1_3D(v) \ |
| if (VB->TexCoordPtr[1]) { \ |
| tc = VB->TexCoordPtr[1]->data; \ |
| pV->TexUnit1.x = tc[##v][0]; \ |
| pV->TexUnit1.y = tc[##v][1]; \ |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Helper functions |
| //--------------------------------------------------------------------------- |
| |
| __inline DWORD _gldComputeFog( |
| GLcontext *ctx, |
| SWvertex *swv) |
| { |
| // Full fog calculation. |
| // Based on Mesa code. |
| |
| GLchan rFog, gFog, bFog; |
| GLchan fR, fG, fB; |
| const GLfloat f = swv->fog; |
| const GLfloat g = 1.0f - f; |
| |
| UNCLAMPED_FLOAT_TO_CHAN(rFog, ctx->Fog.Color[RCOMP]); |
| UNCLAMPED_FLOAT_TO_CHAN(gFog, ctx->Fog.Color[GCOMP]); |
| UNCLAMPED_FLOAT_TO_CHAN(bFog, ctx->Fog.Color[BCOMP]); |
| fR = f * swv->color[0] + g * rFog; |
| fG = f * swv->color[1] + g * gFog; |
| fB = f * swv->color[2] + g * bFog; |
| return D3DCOLOR_RGBA(fR, fG, fB, swv->color[3]); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_ResetLineStipple_DX8( |
| GLcontext *ctx) |
| { |
| // TODO: Fake stipple with a 32x32 texture. |
| } |
| |
| //--------------------------------------------------------------------------- |
| // 2D (post-transformed) primitives |
| //--------------------------------------------------------------------------- |
| |
| void gld_Points2D_DX8( |
| GLcontext *ctx, |
| GLuint first, |
| GLuint last) |
| { |
| GLD_SETUP_2D_VARS_POINTS; |
| |
| unsigned i; |
| struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
| |
| // _Size is already clamped to MaxPointSize and MinPointSize |
| IDirect3DDevice8_SetRenderState(gld->pDev, D3DRS_POINTSIZE, *((DWORD*)&ctx->Point._Size)); |
| |
| if (VB->Elts) { |
| for (i=first; i<last; i++, pV++) { |
| if (VB->ClipMask[VB->Elts[i]] == 0) { |
| // _swrast_Point( ctx, &verts[VB->Elts[i]] ); |
| GLD_SETUP_GET_SWVERT(VB->Elts[i]); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_SPECULAR; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| } |
| } |
| } else { |
| GLD_SETUP_GET_SWVERT(first); |
| for (i=first; i<last; i++, swv++, pV++) { |
| if (VB->ClipMask[i] == 0) { |
| // _swrast_Point( ctx, &verts[i] ); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_SPECULAR; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| } |
| } |
| } |
| |
| gld->PB2d.pPoints = (BYTE*)pV; |
| gld->PB2d.nPoints += (last-first); |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line2DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1) |
| { |
| GLD_SETUP_2D_VARS_LINES; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_GET_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_GET_FLAT_SPECULAR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| gld->PB2d.pLines = (BYTE*)pV; |
| gld->PB2d.nLines++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line2DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1) |
| { |
| GLD_SETUP_2D_VARS_LINES; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_SPECULAR; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_SPECULAR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| gld->PB2d.pLines = (BYTE*)pV; |
| gld->PB2d.nLines++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_GET_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++;; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DFlatExtras_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_TWOSIDED_LIGHTING(v2); |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| if (bFog) |
| GLD_SETUP_GET_FLAT_FOG_COLOUR; |
| else |
| GLD_SETUP_GET_FLAT_COLOUR; |
| GLD_SETUP_GET_FLAT_SPECULAR; |
| GLD_SETUP_GET_FLAT_LIGHTING(v2); |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DSmoothExtras_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_TWOSIDED_LIGHTING(v0); |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v0); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v1); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v2); |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_GET_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_SMOOTH_COLOUR; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DFlatExtras_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_TWOSIDED_LIGHTING(v3); |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| if (bFog) |
| GLD_SETUP_GET_FLAT_FOG_COLOUR; |
| else |
| GLD_SETUP_GET_FLAT_COLOUR; |
| GLD_SETUP_GET_FLAT_SPECULAR; |
| GLD_SETUP_GET_FLAT_LIGHTING(v3); |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_USE_FLAT_COLOUR; |
| GLD_SETUP_USE_FLAT_SPECULAR; |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DSmoothExtras_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_2D_VARS_TRIANGLES; |
| |
| GLD_SETUP_TWOSIDED_LIGHTING(v0); |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v0); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v1); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v1); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v2); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v2); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v2); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v3); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v3); |
| pV++; |
| |
| GLD_SETUP_GET_SWVERT(v0); |
| GLD_SETUP_2D_VERTEX; |
| GLD_SETUP_DEPTH; |
| GLD_SETUP_TEX0; |
| GLD_SETUP_TEX1; |
| GLD_SETUP_LIGHTING(v0); |
| pV++; |
| |
| gld->PB2d.pTriangles = (BYTE*)pV; |
| gld->PB2d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| // 3D (pre-transformed) primitives |
| //--------------------------------------------------------------------------- |
| |
| void gld_Points3D_DX8( |
| GLcontext *ctx, |
| GLuint first, |
| GLuint last) |
| { |
| GLD_SETUP_3D_VARS_POINTS |
| |
| unsigned i; |
| // struct vertex_buffer *VB = &TNL_CONTEXT(ctx)->vb; |
| |
| // _Size is already clamped to MaxPointSize and MinPointSize |
| IDirect3DDevice8_SetRenderState(gld->pDev, D3DRS_POINTSIZE, *((DWORD*)&ctx->Point._Size)); |
| |
| if (VB->Elts) { |
| for (i=first; i<last; i++, pV++) { |
| if (VB->ClipMask[VB->Elts[i]] == 0) { |
| // _swrast_Point( ctx, &verts[VB->Elts[i]] ); |
| // GLD_SETUP_GET_SWVERT(VB->Elts[i]); |
| GLD_SETUP_3D_VERTEX(VB->Elts[i]) |
| GLD_SETUP_SMOOTH_COLOUR_3D(i) |
| GLD_SETUP_TEX0_3D(i) |
| GLD_SETUP_TEX1_3D(i) |
| } |
| } |
| } else { |
| // GLD_SETUP_GET_SWVERT(first); |
| for (i=first; i<last; i++, pV++) { |
| if (VB->ClipMask[i] == 0) { |
| // _swrast_Point( ctx, &verts[i] ); |
| GLD_SETUP_3D_VERTEX(i) |
| GLD_SETUP_SMOOTH_COLOUR_3D(i) |
| GLD_SETUP_TEX0_3D(i) |
| GLD_SETUP_TEX1_3D(i) |
| } |
| } |
| } |
| /* |
| for (i=first; i<last; i++, pV++) { |
| GLD_SETUP_3D_VERTEX(i) |
| GLD_SETUP_SMOOTH_COLOUR_3D(i) |
| GLD_SETUP_TEX0_3D(i) |
| GLD_SETUP_TEX1_3D(i) |
| } |
| */ |
| gld->PB3d.pPoints = (BYTE*)pV; |
| gld->PB3d.nPoints += (last-first); |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Line functions |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line3DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1) |
| { |
| GLD_SETUP_3D_VARS_LINES |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_GET_FLAT_COLOUR_3D(v1) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| gld->PB3d.pLines = (BYTE*)pV; |
| gld->PB3d.nLines++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line3DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1) |
| { |
| GLD_SETUP_3D_VARS_LINES |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v1) |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v0) |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| gld->PB3d.pLines = (BYTE*)pV; |
| gld->PB3d.nLines++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Triangle functions |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle3DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| GLD_SETUP_3D_VARS_TRIANGLES |
| |
| GLD_SETUP_3D_VERTEX(v2) |
| GLD_SETUP_TEX0_3D(v2) |
| GLD_SETUP_TEX1_3D(v2) |
| GLD_SETUP_GET_FLAT_COLOUR_3D(v2) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| pV++; |
| |
| gld->PB3d.pTriangles = (BYTE*)pV; |
| gld->PB3d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle3DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2) |
| { |
| GLD_SETUP_3D_VARS_TRIANGLES |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v0) |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v1) |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v2) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v2) |
| GLD_SETUP_TEX0_3D(v2) |
| GLD_SETUP_TEX1_3D(v2) |
| pV++; |
| |
| gld->PB3d.pTriangles = (BYTE*)pV; |
| gld->PB3d.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Quad functions |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad3DFlat_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_3D_VARS_TRIANGLES |
| |
| GLD_SETUP_3D_VERTEX(v3) |
| GLD_SETUP_GET_FLAT_COLOUR_3D(v3) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v3) |
| GLD_SETUP_TEX1_3D(v3) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v2) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v2) |
| GLD_SETUP_TEX1_3D(v2) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v3) |
| GLD_SETUP_USE_FLAT_COLOUR_3D |
| GLD_SETUP_TEX0_3D(v3) |
| GLD_SETUP_TEX1_3D(v3) |
| pV++; |
| |
| gld->PB3d.pTriangles = (BYTE*)pV; |
| gld->PB3d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad3DSmooth_DX8( |
| GLcontext *ctx, |
| GLuint v0, |
| GLuint v1, |
| GLuint v2, |
| GLuint v3) |
| { |
| GLD_SETUP_3D_VARS_TRIANGLES |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v0) |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v1) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v1) |
| GLD_SETUP_TEX0_3D(v1) |
| GLD_SETUP_TEX1_3D(v1) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v2) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v2) |
| GLD_SETUP_TEX0_3D(v2) |
| GLD_SETUP_TEX1_3D(v2) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v2) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v2) |
| GLD_SETUP_TEX0_3D(v2) |
| GLD_SETUP_TEX1_3D(v2) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v3) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v3) |
| GLD_SETUP_TEX0_3D(v3) |
| GLD_SETUP_TEX1_3D(v3) |
| pV++; |
| |
| GLD_SETUP_3D_VERTEX(v0) |
| GLD_SETUP_SMOOTH_COLOUR_3D(v0) |
| GLD_SETUP_TEX0_3D(v0) |
| GLD_SETUP_TEX1_3D(v0) |
| pV++; |
| |
| gld->PB3d.pTriangles = (BYTE*)pV; |
| gld->PB3d.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| // Vertex setup for two-sided-lighting vertex shader |
| //--------------------------------------------------------------------------- |
| |
| /* |
| |
| void gld_Points2DTwoside_DX8(GLcontext *ctx, GLuint first, GLuint last) |
| { |
| // NOTE: Two-sided lighting does not apply to Points |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line2DFlatTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1) |
| { |
| // NOTE: Two-sided lighting does not apply to Lines |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Line2DSmoothTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1) |
| { |
| // NOTE: Two-sided lighting does not apply to Lines |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DFlatTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2) |
| { |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Triangle2DSmoothTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2) |
| { |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); |
| GLD_TWOSIDED_VERTEX *pV = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles; |
| SScontext *ss = SWSETUP_CONTEXT(ctx); |
| SWvertex *swv; |
| DWORD dwSpecularColour; |
| DWORD dwFlatColour; |
| GLuint facing = 0; |
| struct vertex_buffer *VB; |
| GLchan (*vbcolor)[4]; |
| GLchan (*vbspec)[4]; |
| |
| // Reciprocal of DepthMax |
| const float ooDepthMax = 1.0f / ctx->DepthMaxF; |
| |
| // 1st vert |
| swv = &ss->verts[v0]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 2nd vert |
| swv = &ss->verts[v1]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 3rd vert |
| swv = &ss->verts[v2]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| gld->PBtwosidelight.pTriangles = (BYTE*)pV; |
| gld->PBtwosidelight.nTriangles++; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DFlatTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3) |
| { |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); |
| GLD_TWOSIDED_VERTEX *pV = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles; |
| SScontext *ss = SWSETUP_CONTEXT(ctx); |
| SWvertex *swv; |
| DWORD dwSpecularColour; |
| DWORD dwFlatColour; |
| GLuint facing = 0; |
| struct vertex_buffer *VB; |
| GLchan (*vbcolor)[4]; |
| GLchan (*vbspec)[4]; |
| |
| // Reciprocal of DepthMax |
| const float ooDepthMax = 1.0f / ctx->DepthMaxF; |
| |
| // 1st vert |
| swv = &ss->verts[v0]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 2nd vert |
| swv = &ss->verts[v1]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 3rd vert |
| swv = &ss->verts[v2]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 4th vert |
| swv = &ss->verts[v2]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 5th vert |
| swv = &ss->verts[v3]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 6th vert |
| swv = &ss->verts[v0]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| gld->PBtwosidelight.pTriangles = (BYTE*)pV; |
| gld->PBtwosidelight.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| void gld_Quad2DSmoothTwoside_DX8(GLcontext *ctx, GLuint v0, GLuint v1, GLuint v2, GLuint v3) |
| { |
| GLD_context *gldCtx = GLD_GET_CONTEXT(ctx); |
| GLD_driver_dx8 *gld = GLD_GET_DX8_DRIVER(gldCtx); |
| GLD_TWOSIDED_VERTEX *pV = (GLD_TWOSIDED_VERTEX*)gld->PBtwosidelight.pTriangles; |
| SScontext *ss = SWSETUP_CONTEXT(ctx); |
| SWvertex *swv; |
| DWORD dwSpecularColour; |
| DWORD dwFlatColour; |
| GLuint facing = 0; |
| struct vertex_buffer *VB; |
| GLchan (*vbcolor)[4]; |
| GLchan (*vbspec)[4]; |
| |
| // Reciprocal of DepthMax |
| const float ooDepthMax = 1.0f / ctx->DepthMaxF; |
| |
| // 1st vert |
| swv = &ss->verts[v0]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 2nd vert |
| swv = &ss->verts[v1]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 3rd vert |
| swv = &ss->verts[v2]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 4th vert |
| swv = &ss->verts[v2]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 5th vert |
| swv = &ss->verts[v3]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| // 6th vert |
| swv = &ss->verts[v0]; |
| pV->Position.x = swv->win[0]; |
| pV->Position.y = GLD_FLIP_Y(swv->win[1]); |
| pV->Position.z = swv->win[2] * ooDepthMax; |
| pV->Position.w = swv->win[3]; |
| pV->TexUnit0.x = swv->texcoord[0][0]; |
| pV->TexUnit0.y = swv->texcoord[0][1]; |
| pV->TexUnit1.x = swv->texcoord[1][0]; |
| pV->TexUnit1.y = swv->texcoord[1][1]; |
| pV->FrontDiffuse = GLD_COLOUR; |
| pV->FrontSpecular = GLD_SPECULAR; |
| pV++; |
| |
| gld->PBtwosidelight.pTriangles = (BYTE*)pV; |
| gld->PBtwosidelight.nTriangles += 2; |
| } |
| |
| //--------------------------------------------------------------------------- |
| |
| */ |