Path: blob/master/libmupen64plus/mupen64plus-video-glide64mk2/src/Glitch64/geometry.cpp
2 views
/*1* Glide64 - Glide video plugin for Nintendo 64 emulators.2* Copyright (c) 2002 Dave20013* Copyright (c) 2003-2009 Sergey 'Gonetz' Lipski4*5* This program is free software; you can redistribute it and/or modify6* it under the terms of the GNU General Public License as published by7* the Free Software Foundation; either version 2 of the License, or8* any later version.9*10* This program is distributed in the hope that it will be useful,11* but WITHOUT ANY WARRANTY; without even the implied warranty of12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the13* GNU General Public License for more details.14*15* You should have received a copy of the GNU General Public License16* along with this program; if not, write to the Free Software17* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA18*/1920#include <stdio.h>21#ifdef _WIN3222#include <windows.h>23#endif // _WIN3224#include "glide.h"25#include "main.h"2627#define Z_MAX (65536.0f)2829static int xy_off;30static int xy_en;31static int z_en;32static int z_off;33static int q_off;34static int q_en;35static int pargb_off;36static int pargb_en;37static int st0_off;38static int st0_en;39static int st1_off;40static int st1_en;41static int fog_ext_off;42static int fog_ext_en;4344int w_buffer_mode;45int inverted_culling;46int culling_mode;4748inline float ZCALC(const float & z, const float & q) {49float res = z_en ? ((z) / Z_MAX) / (q) : 1.0f;50return res;51}5253#define zclamp (1.0f-1.0f/zscale)54static inline void zclamp_glVertex4f(float a, float b, float c, float d)55{56if (c<zclamp) c = zclamp;57glVertex4f(a,b,c,d);58}59#define glVertex4f(a,b,c,d) zclamp_glVertex4f(a,b,c,d)606162static inline float ytex(int tmu, float y) {63if (invtex[tmu])64return invtex[tmu] - y;65else66return y;67}6869void init_geometry()70{71xy_en = q_en = pargb_en = st0_en = st1_en = z_en = 0;72w_buffer_mode = 0;73inverted_culling = 0;7475glDisable(GL_CULL_FACE);76glDisable(GL_DEPTH_TEST);77}7879FX_ENTRY void FX_CALL80grCoordinateSpace( GrCoordinateSpaceMode_t mode )81{82LOG("grCoordinateSpace(%d)\r\n", mode);83switch(mode)84{85case GR_WINDOW_COORDS:86break;87default:88display_warning("unknwown coordinate space : %x", mode);89}90}9192FX_ENTRY void FX_CALL93grVertexLayout(FxU32 param, FxI32 offset, FxU32 mode)94{95LOG("grVertexLayout(%d,%d,%d)\r\n", param, offset, mode);96switch(param)97{98case GR_PARAM_XY:99xy_en = mode;100xy_off = offset;101break;102case GR_PARAM_Z:103z_en = mode;104z_off = offset;105break;106case GR_PARAM_Q:107q_en = mode;108q_off = offset;109break;110case GR_PARAM_FOG_EXT:111fog_ext_en = mode;112fog_ext_off = offset;113break;114case GR_PARAM_PARGB:115pargb_en = mode;116pargb_off = offset;117break;118case GR_PARAM_ST0:119st0_en = mode;120st0_off = offset;121break;122case GR_PARAM_ST1:123st1_en = mode;124st1_off = offset;125break;126default:127display_warning("unknown grVertexLayout parameter : %x", param);128}129}130131FX_ENTRY void FX_CALL132grCullMode( GrCullMode_t mode )133{134LOG("grCullMode(%d)\r\n", mode);135static int oldmode = -1, oldinv = -1;136culling_mode = mode;137if (inverted_culling == oldinv && oldmode == mode)138return;139oldmode = mode;140oldinv = inverted_culling;141switch(mode)142{143case GR_CULL_DISABLE:144glDisable(GL_CULL_FACE);145break;146case GR_CULL_NEGATIVE:147if (!inverted_culling)148glCullFace(GL_FRONT);149else150glCullFace(GL_BACK);151glEnable(GL_CULL_FACE);152break;153case GR_CULL_POSITIVE:154if (!inverted_culling)155glCullFace(GL_BACK);156else157glCullFace(GL_FRONT);158glEnable(GL_CULL_FACE);159break;160default:161display_warning("unknown cull mode : %x", mode);162}163}164165// Depth buffer166167FX_ENTRY void FX_CALL168grDepthBufferMode( GrDepthBufferMode_t mode )169{170LOG("grDepthBufferMode(%d)\r\n", mode);171switch(mode)172{173case GR_DEPTHBUFFER_DISABLE:174glDisable(GL_DEPTH_TEST);175w_buffer_mode = 0;176return;177case GR_DEPTHBUFFER_WBUFFER:178case GR_DEPTHBUFFER_WBUFFER_COMPARE_TO_BIAS:179glEnable(GL_DEPTH_TEST);180w_buffer_mode = 1;181break;182case GR_DEPTHBUFFER_ZBUFFER:183case GR_DEPTHBUFFER_ZBUFFER_COMPARE_TO_BIAS:184glEnable(GL_DEPTH_TEST);185w_buffer_mode = 0;186break;187default:188display_warning("unknown depth buffer mode : %x", mode);189}190}191192FX_ENTRY void FX_CALL193grDepthBufferFunction( GrCmpFnc_t function )194{195LOG("grDepthBufferFunction(%d)\r\n", function);196switch(function)197{198case GR_CMP_GEQUAL:199if (w_buffer_mode)200glDepthFunc(GL_LEQUAL);201else202glDepthFunc(GL_GEQUAL);203break;204case GR_CMP_LEQUAL:205if (w_buffer_mode)206glDepthFunc(GL_GEQUAL);207else208glDepthFunc(GL_LEQUAL);209break;210case GR_CMP_LESS:211if (w_buffer_mode)212glDepthFunc(GL_GREATER);213else214glDepthFunc(GL_LESS);215break;216case GR_CMP_ALWAYS:217glDepthFunc(GL_ALWAYS);218break;219case GR_CMP_EQUAL:220glDepthFunc(GL_EQUAL);221break;222case GR_CMP_GREATER:223if (w_buffer_mode)224glDepthFunc(GL_LESS);225else226glDepthFunc(GL_GREATER);227break;228case GR_CMP_NEVER:229glDepthFunc(GL_NEVER);230break;231case GR_CMP_NOTEQUAL:232glDepthFunc(GL_NOTEQUAL);233break;234235default:236display_warning("unknown depth buffer function : %x", function);237}238}239240FX_ENTRY void FX_CALL241grDepthMask( FxBool mask )242{243LOG("grDepthMask(%d)\r\n", mask);244glDepthMask(mask);245}246247float biasFactor = 0;248void FindBestDepthBias()249{250float f, bestz = 0.25f;251int x;252if (biasFactor) return;253biasFactor = 64.0f; // default value254glPushAttrib(GL_ALL_ATTRIB_BITS);255glEnable(GL_DEPTH_TEST);256glDepthFunc(GL_ALWAYS);257glEnable(GL_POLYGON_OFFSET_FILL);258glDrawBuffer(GL_BACK);259glReadBuffer(GL_BACK);260glDisable(GL_BLEND);261glDisable(GL_ALPHA_TEST);262glColor4ub(255,255,255,255);263glDepthMask(GL_TRUE);264for (x=0, f=1.0f; f<=65536.0f; x+=4, f*=2.0f) {265float z;266glPolygonOffset(0, f);267glBegin(GL_TRIANGLE_STRIP);268glVertex3f(float(x+4 - widtho)/(width/2), float(0 - heighto)/(height/2), 0.5);269glVertex3f(float(x - widtho)/(width/2), float(0 - heighto)/(height/2), 0.5);270glVertex3f(float(x+4 - widtho)/(width/2), float(4 - heighto)/(height/2), 0.5);271glVertex3f(float(x - widtho)/(width/2), float(4 - heighto)/(height/2), 0.5);272glEnd();273274glReadPixels(x+2, 2+viewport_offset, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &z);275z -= 0.75f + 8e-6f;276if (z<0.0f) z = -z;277if (z > 0.01f) continue;278if (z < bestz) {279bestz = z;280biasFactor = f;281}282//printf("f %g z %g\n", f, z);283}284//printf(" --> bias factor %g\n", biasFactor);285glPopAttrib();286}287288FX_ENTRY void FX_CALL289grDepthBiasLevel( FxI32 level )290{291LOG("grDepthBiasLevel(%d)\r\n", level);292if (level)293{294if(w_buffer_mode)295glPolygonOffset(1.0f, -(float)level*zscale/255.0f);296else297glPolygonOffset(0, (float)level*biasFactor);298glEnable(GL_POLYGON_OFFSET_FILL);299}300else301{302glPolygonOffset(0,0);303glDisable(GL_POLYGON_OFFSET_FILL);304}305}306307// draw308309FX_ENTRY void FX_CALL310grDrawTriangle( const void *a, const void *b, const void *c )311{312float *a_x = (float*)a + xy_off/sizeof(float);313float *a_y = (float*)a + xy_off/sizeof(float) + 1;314float *a_z = (float*)a + z_off/sizeof(float);315float *a_q = (float*)a + q_off/sizeof(float);316unsigned char *a_pargb = (unsigned char*)a + pargb_off;317float *a_s0 = (float*)a + st0_off/sizeof(float);318float *a_t0 = (float*)a + st0_off/sizeof(float) + 1;319float *a_s1 = (float*)a + st1_off/sizeof(float);320float *a_t1 = (float*)a + st1_off/sizeof(float) + 1;321float *a_fog = (float*)a + fog_ext_off/sizeof(float);322323float *b_x = (float*)b + xy_off/sizeof(float);324float *b_y = (float*)b + xy_off/sizeof(float) + 1;325float *b_z = (float*)b + z_off/sizeof(float);326float *b_q = (float*)b + q_off/sizeof(float);327unsigned char *b_pargb = (unsigned char*)b + pargb_off;328float *b_s0 = (float*)b + st0_off/sizeof(float);329float *b_t0 = (float*)b + st0_off/sizeof(float) + 1;330float *b_s1 = (float*)b + st1_off/sizeof(float);331float *b_t1 = (float*)b + st1_off/sizeof(float) + 1;332float *b_fog = (float*)b + fog_ext_off/sizeof(float);333334float *c_x = (float*)c + xy_off/sizeof(float);335float *c_y = (float*)c + xy_off/sizeof(float) + 1;336float *c_z = (float*)c + z_off/sizeof(float);337float *c_q = (float*)c + q_off/sizeof(float);338unsigned char *c_pargb = (unsigned char*)c + pargb_off;339float *c_s0 = (float*)c + st0_off/sizeof(float);340float *c_t0 = (float*)c + st0_off/sizeof(float) + 1;341float *c_s1 = (float*)c + st1_off/sizeof(float);342float *c_t1 = (float*)c + st1_off/sizeof(float) + 1;343float *c_fog = (float*)c + fog_ext_off/sizeof(float);344LOG("grDrawTriangle()\r\n");345346// ugly ? i know but nvidia drivers are losing the viewport otherwise347348if(nvidia_viewport_hack && !render_to_texture)349{350glViewport(0, viewport_offset, viewport_width, viewport_height);351nvidia_viewport_hack = 0;352}353354reloadTexture();355356if(need_to_compile) compile_shader();357358glBegin(GL_TRIANGLES);359360if (nbTextureUnits > 2)361{362if (st0_en)363glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *a_s0 / *a_q / (float)tex1_width,364ytex(0, *a_t0 / *a_q / (float)tex1_height));365if (st1_en)366glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *a_s1 / *a_q / (float)tex0_width,367ytex(1, *a_t1 / *a_q / (float)tex0_height));368}369else370{371if (st0_en)372glTexCoord2f(*a_s0 / *a_q / (float)tex0_width,373ytex(0, *a_t0 / *a_q / (float)tex0_height));374}375if (pargb_en)376glColor4f(a_pargb[2]/255.0f, a_pargb[1]/255.0f, a_pargb[0]/255.0f, a_pargb[3]/255.0f);377if (fog_enabled && fog_coord_support)378{379if(!fog_ext_en || fog_enabled != 2)380glSecondaryColor3f((1.0f / *a_q) / 255.0f, 0.0f, 0.0f);381else382glSecondaryColor3f((1.0f / *a_fog) / 255.0f, 0.0f, 0.0f);383}384glVertex4f((*a_x - (float)widtho) / (float)(width/2) / *a_q,385-(*a_y - (float)heighto) / (float)(height/2) / *a_q, ZCALC(*a_z, *a_q), 1.0f / *a_q);386387if (nbTextureUnits > 2)388{389if (st0_en)390glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *b_s0 / *b_q / (float)tex1_width,391ytex(0, *b_t0 / *b_q / (float)tex1_height));392if (st1_en)393glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *b_s1 / *b_q / (float)tex0_width,394ytex(1, *b_t1 / *b_q / (float)tex0_height));395}396else397{398if (st0_en)399glTexCoord2f(*b_s0 / *b_q / (float)tex0_width,400ytex(0, *b_t0 / *b_q / (float)tex0_height));401}402if (pargb_en)403glColor4f(b_pargb[2]/255.0f, b_pargb[1]/255.0f, b_pargb[0]/255.0f, b_pargb[3]/255.0f);404if (fog_enabled && fog_coord_support)405{406if(!fog_ext_en || fog_enabled != 2)407glSecondaryColor3f((1.0f / *b_q) / 255.0f, 0.0f, 0.0f);408else409glSecondaryColor3f((1.0f / *b_fog) / 255.0f, 0.0f, 0.0f);410}411412glVertex4f((*b_x - (float)widtho) / (float)(width/2) / *b_q,413-(*b_y - (float)heighto) / (float)(height/2) / *b_q, ZCALC(*b_z, *b_q), 1.0f / *b_q);414415if (nbTextureUnits > 2)416{417if (st0_en)418glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *c_s0 / *c_q / (float)tex1_width,419ytex(0, *c_t0 / *c_q / (float)tex1_height));420if (st1_en)421glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *c_s1 / *c_q / (float)tex0_width,422ytex(1, *c_t1 / *c_q / (float)tex0_height));423}424else425{426if (st0_en)427glTexCoord2f(*c_s0 / *c_q / (float)tex0_width,428ytex(0, *c_t0 / *c_q / (float)tex0_height));429}430if (pargb_en)431glColor4f(c_pargb[2]/255.0f, c_pargb[1]/255.0f, c_pargb[0]/255.0f, c_pargb[3]/255.0f);432if (fog_enabled && fog_coord_support)433{434if(!fog_ext_en || fog_enabled != 2)435glSecondaryColor3f((1.0f / *c_q) / 255.0f, 0.0f, 0.0f);436else437glSecondaryColor3f((1.0f / *c_fog) / 255.0f, 0.0f, 0.0f);438}439glVertex4f((*c_x - (float)widtho) / (float)(width/2) / *c_q,440-(*c_y - (float)heighto) / (float)(height/2) / *c_q, ZCALC(*c_z ,*c_q), 1.0f / *c_q);441442glEnd();443}444445FX_ENTRY void FX_CALL446grDrawPoint( const void *pt )447{448float *x = (float*)pt + xy_off/sizeof(float);449float *y = (float*)pt + xy_off/sizeof(float) + 1;450float *z = (float*)pt + z_off/sizeof(float);451float *q = (float*)pt + q_off/sizeof(float);452unsigned char *pargb = (unsigned char*)pt + pargb_off;453float *s0 = (float*)pt + st0_off/sizeof(float);454float *t0 = (float*)pt + st0_off/sizeof(float) + 1;455float *s1 = (float*)pt + st1_off/sizeof(float);456float *t1 = (float*)pt + st1_off/sizeof(float) + 1;457float *fog = (float*)pt + fog_ext_off/sizeof(float);458LOG("grDrawPoint()\r\n");459460if(nvidia_viewport_hack && !render_to_texture)461{462glViewport(0, viewport_offset, viewport_width, viewport_height);463nvidia_viewport_hack = 0;464}465466reloadTexture();467468if(need_to_compile) compile_shader();469470glBegin(GL_POINTS);471472if (nbTextureUnits > 2)473{474if (st0_en)475glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *s0 / *q / (float)tex1_width,476ytex(0, *t0 / *q / (float)tex1_height));477if (st1_en)478glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *s1 / *q / (float)tex0_width,479ytex(1, *t1 / *q / (float)tex0_height));480}481else482{483if (st0_en)484glTexCoord2f(*s0 / *q / (float)tex0_width,485ytex(0, *t0 / *q / (float)tex0_height));486}487if (pargb_en)488glColor4f(pargb[2]/255.0f, pargb[1]/255.0f, pargb[0]/255.0f, pargb[3]/255.0f);489if (fog_enabled && fog_coord_support)490{491if(!fog_ext_en || fog_enabled != 2)492glSecondaryColor3f((1.0f / *q) / 255.0f, 0.0f, 0.0f);493else494glSecondaryColor3f((1.0f / *fog) / 255.0f, 0.0f, 0.0f);495}496glVertex4f((*x - (float)widtho) / (float)(width/2) / *q,497-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z ,*q), 1.0f / *q);498499glEnd();500}501502FX_ENTRY void FX_CALL503grDrawLine( const void *a, const void *b )504{505float *a_x = (float*)a + xy_off/sizeof(float);506float *a_y = (float*)a + xy_off/sizeof(float) + 1;507float *a_z = (float*)a + z_off/sizeof(float);508float *a_q = (float*)a + q_off/sizeof(float);509unsigned char *a_pargb = (unsigned char*)a + pargb_off;510float *a_s0 = (float*)a + st0_off/sizeof(float);511float *a_t0 = (float*)a + st0_off/sizeof(float) + 1;512float *a_s1 = (float*)a + st1_off/sizeof(float);513float *a_t1 = (float*)a + st1_off/sizeof(float) + 1;514float *a_fog = (float*)a + fog_ext_off/sizeof(float);515516float *b_x = (float*)b + xy_off/sizeof(float);517float *b_y = (float*)b + xy_off/sizeof(float) + 1;518float *b_z = (float*)b + z_off/sizeof(float);519float *b_q = (float*)b + q_off/sizeof(float);520unsigned char *b_pargb = (unsigned char*)b + pargb_off;521float *b_s0 = (float*)b + st0_off/sizeof(float);522float *b_t0 = (float*)b + st0_off/sizeof(float) + 1;523float *b_s1 = (float*)b + st1_off/sizeof(float);524float *b_t1 = (float*)b + st1_off/sizeof(float) + 1;525float *b_fog = (float*)b + fog_ext_off/sizeof(float);526LOG("grDrawLine()\r\n");527528if(nvidia_viewport_hack && !render_to_texture)529{530glViewport(0, viewport_offset, viewport_width, viewport_height);531nvidia_viewport_hack = 0;532}533534reloadTexture();535536if(need_to_compile) compile_shader();537538glBegin(GL_LINES);539540if (nbTextureUnits > 2)541{542if (st0_en)543glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *a_s0 / *a_q / (float)tex1_width, ytex(0, *a_t0 / *a_q / (float)tex1_height));544if (st1_en)545glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *a_s1 / *a_q / (float)tex0_width, ytex(1, *a_t1 / *a_q / (float)tex0_height));546}547else548{549if (st0_en)550glTexCoord2f(*a_s0 / *a_q / (float)tex0_width, ytex(0, *a_t0 / *a_q / (float)tex0_height));551}552if (pargb_en)553glColor4f(a_pargb[2]/255.0f, a_pargb[1]/255.0f, a_pargb[0]/255.0f, a_pargb[3]/255.0f);554if (fog_enabled && fog_coord_support)555{556if(!fog_ext_en || fog_enabled != 2)557glSecondaryColor3f((1.0f / *a_q) / 255.0f, 0.0f, 0.0f);558else559glSecondaryColor3f((1.0f / *a_fog) / 255.0f, 0.0f, 0.0f);560}561glVertex4f((*a_x - (float)widtho) / (float)(width/2) / *a_q,562-(*a_y - (float)heighto) / (float)(height/2) / *a_q, ZCALC(*a_z, *a_q), 1.0f / *a_q);563564if (nbTextureUnits > 2)565{566if (st0_en)567glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *b_s0 / *b_q / (float)tex1_width,568ytex(0, *b_t0 / *b_q / (float)tex1_height));569if (st1_en)570glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *b_s1 / *b_q / (float)tex0_width,571ytex(1, *b_t1 / *b_q / (float)tex0_height));572}573else574{575if (st0_en)576glTexCoord2f(*b_s0 / *b_q / (float)tex0_width,577ytex(0, *b_t0 / *b_q / (float)tex0_height));578}579if (pargb_en)580glColor4f(b_pargb[2]/255.0f, b_pargb[1]/255.0f, b_pargb[0]/255.0f, b_pargb[3]/255.0f);581if (fog_enabled && fog_coord_support)582{583if(!fog_ext_en || fog_enabled != 2)584glSecondaryColor3f((1.0f / *b_q) / 255.0f, 0.0f, 0.0f);585else586glSecondaryColor3f((1.0f / *b_fog) / 255.0f, 0.0f, 0.0f);587}588glVertex4f((*b_x - (float)widtho) / (float)(width/2) / *b_q,589-(*b_y - (float)heighto) / (float)(height/2) / *b_q, ZCALC(*b_z, *b_q), 1.0f / *b_q);590591glEnd();592}593594FX_ENTRY void FX_CALL595grDrawVertexArray(FxU32 mode, FxU32 Count, void *pointers2)596{597unsigned int i;598float *x, *y, *q, *s0, *t0, *s1, *t1, *z, *fog;599unsigned char *pargb;600void **pointers = (void**)pointers2;601LOG("grDrawVertexArray(%d,%d)\r\n", mode, Count);602603if(nvidia_viewport_hack && !render_to_texture)604{605glViewport(0, viewport_offset, viewport_width, viewport_height);606nvidia_viewport_hack = 0;607}608609reloadTexture();610611if(need_to_compile) compile_shader();612613switch(mode)614{615case GR_TRIANGLE_FAN:616glBegin(GL_TRIANGLE_FAN);617break;618default:619display_warning("grDrawVertexArray : unknown mode : %x", mode);620}621622for (i=0; i<Count; i++)623{624x = (float*)pointers[i] + xy_off/sizeof(float);625y = (float*)pointers[i] + xy_off/sizeof(float) + 1;626z = (float*)pointers[i] + z_off/sizeof(float);627q = (float*)pointers[i] + q_off/sizeof(float);628pargb = (unsigned char*)pointers[i] + pargb_off;629s0 = (float*)pointers[i] + st0_off/sizeof(float);630t0 = (float*)pointers[i] + st0_off/sizeof(float) + 1;631s1 = (float*)pointers[i] + st1_off/sizeof(float);632t1 = (float*)pointers[i] + st1_off/sizeof(float) + 1;633fog = (float*)pointers[i] + fog_ext_off/sizeof(float);634635if (nbTextureUnits > 2)636{637if (st0_en)638glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *s0 / *q / (float)tex1_width,639ytex(0, *t0 / *q / (float)tex1_height));640if (st1_en)641glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *s1 / *q / (float)tex0_width,642ytex(1, *t1 / *q / (float)tex0_height));643}644else645{646if (st0_en)647glTexCoord2f(*s0 / *q / (float)tex0_width,648ytex(0, *t0 / *q / (float)tex0_height));649}650if (pargb_en)651glColor4f(pargb[2]/255.0f, pargb[1]/255.0f, pargb[0]/255.0f, pargb[3]/255.0f);652if (fog_enabled && fog_coord_support)653{654if(!fog_ext_en || fog_enabled != 2)655glSecondaryColor3f((1.0f / *q) / 255.0f, 0.0f, 0.0f);656else657glSecondaryColor3f((1.0f / *fog) / 255.0f, 0.0f, 0.0f);658}659glVertex4f((*x - (float)widtho) / (float)(width/2) / *q,660-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z, *q), 1.0f / *q);661}662glEnd();663}664665FX_ENTRY void FX_CALL666grDrawVertexArrayContiguous(FxU32 mode, FxU32 Count, void *pointers, FxU32 stride)667{668unsigned int i;669float *x, *y, *q, *s0, *t0, *s1, *t1, *z, *fog;670unsigned char *pargb;671LOG("grDrawVertexArrayContiguous(%d,%d,%d)\r\n", mode, Count, stride);672673if(nvidia_viewport_hack && !render_to_texture)674{675glViewport(0, viewport_offset, viewport_width, viewport_height);676nvidia_viewport_hack = 0;677}678679reloadTexture();680681if(need_to_compile) compile_shader();682683switch(mode)684{685case GR_TRIANGLE_STRIP:686glBegin(GL_TRIANGLE_STRIP);687break;688case GR_TRIANGLE_FAN:689glBegin(GL_TRIANGLE_FAN);690break;691default:692display_warning("grDrawVertexArrayContiguous : unknown mode : %x", mode);693}694695for (i=0; i<Count; i++)696{697x = (float*)((unsigned char*)pointers+stride*i) + xy_off/sizeof(float);698y = (float*)((unsigned char*)pointers+stride*i) + xy_off/sizeof(float) + 1;699z = (float*)((unsigned char*)pointers+stride*i) + z_off/sizeof(float);700q = (float*)((unsigned char*)pointers+stride*i) + q_off/sizeof(float);701pargb = (unsigned char*)pointers+stride*i + pargb_off;702s0 = (float*)((unsigned char*)pointers+stride*i) + st0_off/sizeof(float);703t0 = (float*)((unsigned char*)pointers+stride*i) + st0_off/sizeof(float) + 1;704s1 = (float*)((unsigned char*)pointers+stride*i) + st1_off/sizeof(float);705t1 = (float*)((unsigned char*)pointers+stride*i) + st1_off/sizeof(float) + 1;706fog = (float*)((unsigned char*)pointers+stride*i) + fog_ext_off/sizeof(float);707708//if(*fog == 0.0f) *fog = 1.0f;709710if (nbTextureUnits > 2)711{712if (st0_en)713glMultiTexCoord2fARB(GL_TEXTURE1_ARB, *s0 / *q / (float)tex1_width,714ytex(0, *t0 / *q / (float)tex1_height));715if (st1_en)716glMultiTexCoord2fARB(GL_TEXTURE0_ARB, *s1 / *q / (float)tex0_width,717ytex(1, *t1 / *q / (float)tex0_height));718}719else720{721if (st0_en)722glTexCoord2f(*s0 / *q / (float)tex0_width,723ytex(0, *t0 / *q / (float)tex0_height));724}725if (pargb_en)726glColor4f(pargb[2]/255.0f, pargb[1]/255.0f, pargb[0]/255.0f, pargb[3]/255.0f);727if (fog_enabled && fog_coord_support)728{729if(!fog_ext_en || fog_enabled != 2)730glSecondaryColor3f((1.0f / *q) / 255.0f, 0.0f, 0.0f);731else732glSecondaryColor3f((1.0f / *fog) / 255.0f, 0.0f, 0.0f);733}734735glVertex4f((*x - (float)widtho) / (float)(width/2) / *q,736-(*y - (float)heighto) / (float)(height/2) / *q, ZCALC(*z, *q), 1.0f / *q);737}738glEnd();739}740741742