From 7353cd8189568fec8fc338a6d83bac30849cfcd9 Mon Sep 17 00:00:00 2001 From: driAn Date: Sat, 12 Aug 2006 19:32:36 +0000 Subject: [PATCH] no message git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@323 e016b1c5-ed68-44aa-a2f7-31cac88cffde --- config/menus.cfg | 32 +++++------ packages/maps/test.cgz | Bin 453 -> 379 bytes source/src/bot/ac_bot.cpp | 1 + source/src/bot/botmanager.cpp | 2 +- source/src/clientextras.cpp | 51 ++++++++--------- source/src/clientgame.cpp | 4 +- source/src/cube.h | 19 +++++++ source/src/menus.cpp | 18 ++++-- source/src/protos.h | 4 +- source/src/renderextras.cpp | 47 ++++++++++++++-- source/src/rendermd2.cpp | 103 ++++++++++++++++++++++++++++------ 11 files changed, 206 insertions(+), 75 deletions(-) diff --git a/config/menus.cfg b/config/menus.cfg index 8a411ce0..8d9832ae 100755 --- a/config/menus.cfg +++ b/config/menus.cfg @@ -11,7 +11,7 @@ menuitem "Load Map" "showmenu maps" menuitem "Options" "showmenu options" menuitem "Editing" "showmenu editing" menuitem "About/Credits/Help" "showmenu about" -menuitem "quit" "quit" +menuitem "Quit" "quit" // menubg "textures/blah..." // menumdl path frame range rotation-speed{0..100} scale{0..100} @@ -55,29 +55,29 @@ menuitem "RVSF Skins" "showmenu rvsf" newmenu "cla" -menumdl playermodels/terrorist/01/menu 0 1 50 5 -menuitem "Comandante" "skin 0" "chmenumdl cla playermodels/terrorist/01/menu 0 1 50 5" -menuitem "Psycho" "skin 1" "chmenumdl cla playermodels/terrorist/02/menu 0 1 50 5" -menuitem "Bomber" "skin 2" "chmenumdl cla playermodels/terrorist/03/menu 0 1 50 5" -menuitem "Ripper" "skin 3" "chmenumdl cla playermodels/terrorist/04/menu 0 1 50 5" +menumdl playermodels/terrorist/01 0 197 50 5 +menuitem "Comandante" "skin 0" "chmenumdl cla playermodels/terrorist/01 0 197 50 5" +menuitem "Psycho" "skin 1" "chmenumdl cla playermodels/terrorist/02 0 197 50 5" +menuitem "Bomber" "skin 2" "chmenumdl cla playermodels/terrorist/03 0 197 50 5" +menuitem "Ripper" "skin 3" "chmenumdl cla playermodels/terrorist/04 0 197 50 5" newmenu "rvsf" -menumdl playermodels/counterterrorist/01/menu 0 1 50 5 -menuitem "Alpha" "skin 0" "chmenumdl rvsf playermodels/counterterrorist/01/menu 0 1 50 5" -menuitem "Tango" "skin 1" "chmenumdl rvsf playermodels/counterterrorist/02/menu 0 1 50 5" -menuitem "Cobra" "skin 2" "chmenumdl rvsf playermodels/counterterrorist/03/menu 0 1 50 5" -menuitem "Viper" "skin 3" "chmenumdl rvsf playermodels/counterterrorist/04/menu 0 1 50 5" -menuitem "Swat" "skin 4" "chmenumdl rvsf playermodels/counterterrorist/05/menu 0 1 50 5" -menuitem "Police" "skin 5" "chmenumdl rvsf playermodels/counterterrorist/06/menu 0 1 50 5" +menumdl playermodels/counterterrorist/01 0 197 50 5 +menuitem "Alpha" "skin 0" "chmenumdl rvsf playermodels/counterterrorist/01 0 197 50 5" +menuitem "Tango" "skin 1" "chmenumdl rvsf playermodels/counterterrorist/02 0 197 50 5" +menuitem "Cobra" "skin 2" "chmenumdl rvsf playermodels/counterterrorist/03 0 197 50 5" +menuitem "Viper" "skin 3" "chmenumdl rvsf playermodels/counterterrorist/04 0 197 50 5" +menuitem "Swat" "skin 4" "chmenumdl rvsf playermodels/counterterrorist/05 0 197 50 5" +menuitem "Police" "skin 5" "chmenumdl rvsf playermodels/counterterrorist/06 0 197 50 5" newmenu team -menumdl playermodels/terrorist/01/menu 0 1 50 5 -menuitem "Cuban Liberations Army" "team CLA" "chmenumdl team playermodels/terrorist/01/menu 0 1 50 5" -menuitem "Rabid Viper Special Forces" "team RVSF" "chmenumdl team playermodels/counterterrorist/03/menu 0 1 50 5" +menumdl playermodels/terrorist/01 0 197 50 5 +menuitem "Cuban Liberations Army" "team CLA" "chmenumdl team playermodels/terrorist/01 0 197 50 5" +menuitem "Rabid Viper Special Forces" "team RVSF" "chmenumdl team playermodels/counterterrorist/03 0 197 50 5" newmenu multiplayer diff --git a/packages/maps/test.cgz b/packages/maps/test.cgz index 9b9c7cb3ccade4f934e8f23d23762f856728e1de..6fceb887b4ac4b19d68294c98b2abae0f3bcc227 100644 GIT binary patch delta 126 zcmX@g{F}*4zMF#q47iI+zHucaCnW4RbmjoVBFRPzll3Z_Rn$#g51MauP+S?LXrgbe zzu%_6F|T3bL&c6|I|@n3KJ{xR`|x*9$yINfcmc e)9P5wuk^$H=i)ztN7$b;GQ>)+%y`SjzyJU)%r0O6 delta 226 zcmV<803HAP0>uMWABzY80000000VP$_6lHQU|_hy%)kJmS%Ek-uOzc1CpAUEH?cq= zsZt>{FFP;4Jdc51K%S9-iJ66!jh%y&i<^g+k6%DgNLWNvOk6@zN?Jx%PLWjYf1iO7 zulMCg{Xe|@pHK-50}22ag9-x+gApSSBLf3Jkj={A%*X^}n}ON73_L(JhG2FGBNLFV z0A#ZPNycf@rZF%v{09L}76t)eEP%NBAcBA3_~Iaf3BeZ`l^-GUj9@-HLW&state = CS_ALIVE; m_pMyEnt->anger = 0; m_pMyEnt->pBot = this; + m_pMyEnt->lastanimswitchtime = -1; // loopi(NUMGUNS) m_pMyEnt->ammo[i] = m_pMyEnt->mag[i] = 0; /* UNDONE diff --git a/source/src/bot/botmanager.cpp b/source/src/bot/botmanager.cpp index 23341699..368ea5b6 100644 --- a/source/src/bot/botmanager.cpp +++ b/source/src/bot/botmanager.cpp @@ -324,7 +324,7 @@ void CBotManager::RenderBots() if (bots[i] && (bots[i] != m_pBotToView)) { drawblue = (m_sp || isteam(player1->team, bots[i]->team)); - renderclient(bots[i], drawblue, "playermodels/counterterrorist", false, 1.6f); + renderclient(bots[i], drawblue, "playermodels/counterterrorist", 1.6f); } } } diff --git a/source/src/clientextras.cpp b/source/src/clientextras.cpp index 9f920aba..4f736037 100644 --- a/source/src/clientextras.cpp +++ b/source/src/clientextras.cpp @@ -4,12 +4,16 @@ // render players & monsters // very messy ad-hoc handling of animation frames, should be made more configurable +// idle, run, attack, pain, jump, land, flipoff, salute, taunt, wave, point, crouch idle, crouch walk, crouch attack, crouch pain, crouch death, death, lying dead +// I R A P P P J L F S T W P CI CW CA CP CD D D D LD LD LD +int frame[] = { 0, 40, 46, 54, 58, 62, 66, 69, 72, 84, 95, 112,123,135,154,160,169,173,178,184,190,183,189,197 }; +int range[] = { 40, 5, 8, 4, 4, 4, 3, 3, 12, 11, 17, 11, 13, 19, 6, 9, 4, 5, 6, 6, 8, 1, 1, 1 }; -// D D D D' D D D D' A A' P P' I I' R, R' E L J J' -int frame[] = { 178, 184, 190, 137, 183, 189, 197, 164, 46, 51, 54, 32, 0, 0, 40, 1, 162, 162, 67, 168 }; -int range[] = { 6, 6, 8, 28, 1, 1, 1, 1, 8, 19, 4, 18, 40, 1, 6, 15, 1, 1, 1, 1 }; +// D D D D' D D D D' A A' P P' I I' R, R' Q L J J' +/*int frame[] = { 178, 184, 190, 137, 183, 189, 197, 164, 46, 51, 54, 32, 0, 0, 40, 1, 154, 162, 67, 168 }; +int range[] = { 6, 6, 8, 28, 1, 1, 1, 1, 8, 19, 4, 18, 40, 1, 6, 15, 6, 1, 1, 1 };*/ -void renderclient(dynent *d, bool team, char *mdlname, bool vwep, float scale) +void renderclient(dynent *d, bool team, char *mdlname, float scale) { int n = 3; float speed = 100.0f; @@ -17,32 +21,25 @@ void renderclient(dynent *d, bool team, char *mdlname, bool vwep, float scale) int basetime = -((int)d&0xFFF); if(d->state==CS_DEAD) { - d->pitch = 0.1f; - //if(vwep) mz = S((int)d->o.x, (int)d->o.y)->floor; + /* d->pitch = 0.1f; int r; - n = (int)d%3; r = range[n]; + n = ((int)d%3); + r = range[n]; basetime = d->lastaction; int t = lastmillis-d->lastaction; if(t<0 || t>20000) return; - if(t>(r-1)*100) { n += 4; if(t>(r+10)*100) { t -= (r+10)*100; mz -= t*t/10000000000.0f*t; }; }; - if(mz<-1000) return; - //mdl = (((int)d>>6)&1)+1; - //mz = d->o.z-d->eyeheight+0.2f; - //scale = 1.2f; - /*if(vwep) - { - rendermodel(mdlname, 0, 1, 0, 1.5f, d->o.x, mz, d->o.y, -90, 90, team, scale, speed, 0, basetime); - return; - };*/ + if(t>(r-1)*100) { n += 3; if(t>(r+10)*100) { t -= (r+10)*100; mz -= t*t/10000000000.0f*t; }; }; + n+=18; + if(mz<-1000) return;*/ } - else if(d->state==CS_EDITING) { n = 16; } - else if(d->state==CS_LAGGED) { n = 17; } - else if(d->monsterstate==M_ATTACKING) { n = 8; } - else if(d->monsterstate==M_PAIN) { n = 10; } - else if((!d->move && !d->strafe) || !d->moving) { n = 12; } - else if(!d->onfloor && d->timeinair>100) { n = 18; } - else { n = 14; speed = 1200/d->maxspeed*scale; }; - rendermodel(mdlname, frame[n], range[n], 0, 1.5f, d->o.x, mz, d->o.y, d->yaw+90, d->pitch/2, team, scale, speed, 0, basetime); + else if(d->state==CS_EDITING) { n = 8; } + else if(d->state==CS_LAGGED) { n = 9; } + /*else if(d->monsterstate==M_ATTACKING) { n = 8; } + else if(d->monsterstate==M_PAIN) { n = 10; } */ + else if((!d->move && !d->strafe) || !d->moving) { n = 0; } + else if(!d->onfloor && d->timeinair>100) { n = 6; } + else { n = 1; speed = 1200/d->maxspeed*scale; }; + rendermodel(mdlname, frame[n], range[n], 0, 1.5f, d->o.x, mz, d->o.y, d->yaw+90, d->pitch/2, team, scale, speed, 0, basetime, true, d); }; extern int democlientnum; @@ -53,12 +50,12 @@ void renderplayer(dynent *d) int team = rb_team_int(d->team); sprintf_sd(mdl)("playermodels/%s/0%i", team==TEAM_CLA ? "terrorist" : "counterterrorist", 1 + max(0, min(d->skin, (team==TEAM_CLA ? 3 : 5)))); - renderclient(d, isteam(player1->team, d->team), mdl, false, 1.6f); + renderclient(d, isteam(player1->team, d->team), mdl, 1.6f); if(d->gunselect>=0 && d->gunselectgunselect]); - renderclient(d, isteam(player1->team, d->team), vwep, true, 1.6f); + renderclient(d, isteam(player1->team, d->team), vwep, 1.6f); }; } diff --git a/source/src/clientgame.cpp b/source/src/clientgame.cpp index 3668823c..a3f5dc60 100644 --- a/source/src/clientgame.cpp +++ b/source/src/clientgame.cpp @@ -114,6 +114,7 @@ dynent *newdynent() // create a new blank player or monster d->bIsBot = false; d->pBot = NULL; d->weaponchanging = false; + d->lastanimswitchtime = -1; spawnstate(d); return d; }; @@ -216,8 +217,9 @@ void checkakimbo() { player1->akimbo = false; player1->akimbomillis = 0; - playsoundc(S_PUPOUT); + player1->mag[GUN_PISTOL] = min(magsize(GUN_PISTOL), player1->mag[GUN_PISTOL]); if(player1->gunselect==GUN_PISTOL) weaponswitch(GUN_PISTOL); + playsoundc(S_PUPOUT); } }; diff --git a/source/src/cube.h b/source/src/cube.h index d7b8f517..21581d74 100644 --- a/source/src/cube.h +++ b/source/src/cube.h @@ -130,6 +130,23 @@ public: struct itemstat { int add, start, max, sound; }; // End add + +struct md2state +{ + int anim, frame, range, basetime; + float speed; + //md2state() : anim(0), frame(0), range(0), basetime(0), speed(100.0f) { }; + md2state() + { + anim = frame = range = basetime = 0; + speed = 100.0f; + } + + bool operator==(const md2state &o) const { return frame==o.frame && range==o.range && basetime==o.basetime && speed==o.speed; }; + bool operator!=(const md2state &o) const { return frame!=o.frame || range!=o.range || basetime!=o.basetime || speed!=o.speed; }; +}; + + struct md3state { int anim; @@ -211,6 +228,8 @@ struct dynent // players & monsters int nextprimary; // primary after respawning int skin, nextskin; // skin after respawning md3state animstate[3]; + int lastanimswitchtime; + md2state current, prev; bool onladder; int gravity; diff --git a/source/src/menus.cpp b/source/src/menus.cpp index 6b0b966f..2ae0c741 100644 --- a/source/src/menus.cpp +++ b/source/src/menus.cpp @@ -105,11 +105,21 @@ void rendermenumdl() glRotatef(player1->yaw+90+180, 0, -1, 0); glRotatef(player1->pitch, 0, 0, 1); - if(strstr(m.mdl, "playermodel")==NULL) glTranslatef(2.0f, 1.7f, 0.0f); - else glTranslatef(2.0f, 1.0f, 1.5f); + float z=0.0f; + + if(!strncmp(m.mdl, "playermodels", strlen("playermodels"))) + { + glTranslatef(2.0f, 1.0f, 1.5f); + z = -1.0f; + } + else + { + glTranslatef(2.0f, 1.7f, 0.0f); + } + if(m.rotspeed) glRotatef(lastmillis/5.0f/100.0f*m.rotspeed, 0, 1, 0); - - rendermodel(m.mdl, m.frame, m.range, 0.0f, 0.0f, 0.0f, 0, 0, 0, 0, false, (float)(m.scale ? m.scale/25.0f : 1), 100, 0, 0, false); + + rendermodel(m.mdl, m.frame, m.range, 0.0f, 0.0f, 0.0f, z, 0, 0, 0, false, (float)(m.scale ? m.scale/25.0f : 1), 100, 0, 0, false); glPopMatrix(); } diff --git a/source/src/protos.h b/source/src/protos.h index 8c6e11af..159a6ddd 100644 --- a/source/src/protos.h +++ b/source/src/protos.h @@ -101,7 +101,7 @@ extern void respawn(); // clientextras extern void renderclients(); -extern void renderclient(dynent *d, bool team, char *mdlname, bool hellpig, float scale); +extern void renderclient(dynent *d, bool team, char *mdlname, float scale); void showscores(bool on); extern void renderscores(); @@ -210,7 +210,7 @@ extern void cleansound(); extern void botplaysound(int n, dynent *b); // Added by Rick // rendermd2 -extern void rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap = 0, int basetime = 0, bool oculling=true); +extern void rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap = 0, int basetime = 0, bool oculling=true, dynent *d=NULL); extern mapmodelinfo &getmminfo(int i); // rendermd3 diff --git a/source/src/renderextras.cpp b/source/src/renderextras.cpp index 4c844b98..45525591 100644 --- a/source/src/renderextras.cpp +++ b/source/src/renderextras.cpp @@ -51,19 +51,54 @@ void blendbox(int x1, int y1, int x2, int y2, bool border, int tex) glBindTexture(GL_TEXTURE_2D, tex); glEnable(GL_TEXTURE_2D); glDisable(GL_BLEND); + + float texw = 512.0f; + float texh = texw; + int cols = (x2-x1)/texw+1; + int rows = (y2-y1)/texh+1; + + loopj(rows) + { + float ytexcut = 0.0f; + float yboxcut = 0.0f; + if((j+1)*texh>y2-y1) // cut last row to match the box height*/ + { + yboxcut = (((j+1)*texh)-(y2-y1)); + ytexcut = (((j+1)*texh)-(y2-y1))/texh; + } + + loopi(cols) + { + float xtexcut = 0.0f; + float xboxcut = 0.0f; + if((i+1)*texw>x2-x1) + { + xboxcut = (((i+1)*texw)-(x2-x1)); + xtexcut = (((i+1)*texw)-(x2-x1))/texw; + } + + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(x1+texw*i, y1+texh*j); + glTexCoord2f(1-xtexcut, 0); glVertex2i(x1+texw*(i+1)-xboxcut, y1+texh*j); + glTexCoord2f(1-xtexcut, 1-ytexcut); glVertex2i(x1+texw*(i+1)-xboxcut, y1+texh*(j+1)-yboxcut); + glTexCoord2f(0, 1-ytexcut); glVertex2i(x1+texw*i, y1+texh*(j+1)-yboxcut); + glEnd(); + } + } } else { if(border) glColor3d(0.7, 0.7, 0.7); //glColor3d(0.5, 0.3, 0.4); else glColor3d(1.0, 1.0, 1.0); glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_COLOR); + glBegin(GL_QUADS); + glTexCoord2f(0, 0); glVertex2i(x1, y1); + glTexCoord2f(1, 0); glVertex2i(x2, y1); + glTexCoord2f(1, 1); glVertex2i(x2, y2); + glTexCoord2f(0, 1); glVertex2i(x1, y2); + glEnd(); }; - glBegin(GL_QUADS); - glTexCoord2f(0, 0); glVertex2i(x1, y1); - glTexCoord2f(1, 0); glVertex2i(x2, y1); - glTexCoord2f(1, 1); glVertex2i(x2, y2); - glTexCoord2f(0, 1); glVertex2i(x1, y2); - glEnd(); + glDisable(GL_BLEND); if(tex>=0) glDisable(GL_TEXTURE_2D); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); diff --git a/source/src/rendermd2.cpp b/source/src/rendermd2.cpp index 7fdde80b..bd595954 100644 --- a/source/src/rendermd2.cpp +++ b/source/src/rendermd2.cpp @@ -2,6 +2,38 @@ #include "cube.h" +VARP(animationinterpolationtime, 0, 150, 1000); + +struct md2_anpos +{ + int fr1, fr2; + float frac1, frac2; + + void setframes(md2state &a) + { + int time = lastmillis-a.basetime; + fr1 = (int)(time/a.speed); + frac1 = (time-fr1*a.speed)/a.speed; + frac2 = 1-frac1; + //if(a.anim&ANIM_LOOP) // FIXME + { + fr1 = fr1%a.range+a.frame; + fr2 = fr1+1; + if(fr2>=a.frame+a.range) fr2 = a.frame; + } +/* else + { + fr1 = min(fr1, a.range-1)+a.frame; + fr2 = min(fr1+1, a.frame+a.range-1); + }; + if(a.anim&ANIM_REVERSE) + { + fr1 = (a.frame+a.range-1)-(fr1-a.frame); + fr2 = (a.frame+a.range-1)-(fr2-a.frame); + };*/ + }; +}; + struct md2_header { int magic; @@ -46,7 +78,7 @@ struct md2 bool loaded; bool load(char* filename); - void render(vec &light, int numFrame, int range, float x, float y, float z, float yaw, float pitch, float scale, float speed, int snap, int basetime); + void render(vec &light, int numFrame, int range, float x, float y, float z, float yaw, float pitch, float scale, float speed, int snap, int basetime, dynent *d=NULL); void scale(int frame, float scale, int sn); md2() : numGlCommands(0), frameSize(0), numFrames(0), displaylist(0), loaded(false) {}; @@ -123,9 +155,30 @@ void md2::scale(int frame, float scale, int sn) }; }; -void md2::render(vec &light, int frame, int range, float x, float y, float z, float yaw, float pitch, float sc, float speed, int snap, int basetime) +void md2::render(vec &light, int frame, int range, float x, float y, float z, float yaw, float pitch, float sc, float speed, int snap, int basetime, dynent *d) { - loopi(range) if(!mverts[frame+i]) scale(frame+i, sc, snap); + if(range==0 || frame+range-1>numFrames) + { + return; + } + md2state ai; + ai.frame = frame; + ai.basetime = basetime; + ai.range = range; + ai.speed = speed; + + loopi(ai.range) if(!mverts[ai.frame+i]) scale(ai.frame+i, sc, snap); + + if(d) + { + if(d->lastanimswitchtime==-1) { d->current = ai; d->lastanimswitchtime = lastmillis-animationinterpolationtime*2; } + else if(d->current != ai) + { + if(lastmillis-d->lastanimswitchtime>animationinterpolationtime/2) d->prev = d->current; + d->current = ai; + d->lastanimswitchtime = lastmillis; + }; + }; glPushMatrix (); glTranslatef(x, y, z); @@ -134,29 +187,36 @@ void md2::render(vec &light, int frame, int range, float x, float y, float z, fl glColor3fv((float *)&light); - if(displaylist && frame==0 && range==1) + if(displaylist && ai.frame==0 && ai.range==1) { glCallList(displaylist); xtraverts += displaylistverts; } else { - if(frame==0 && range==1) + if(ai.frame==0 && ai.range==1) { static int displaylistn = 10; glNewList(displaylist = displaylistn++, GL_COMPILE); displaylistverts = xtraverts; }; - int time = lastmillis-basetime; - int fr1 = (int)(time/speed); - float frac1 = (time-fr1*speed)/speed; - float frac2 = 1-frac1; - fr1 = fr1%range+frame; - int fr2 = fr1+1; - if(fr2>=frame+range) fr2 = frame; - vec *verts1 = mverts[fr1]; - vec *verts2 = mverts[fr2]; + md2_anpos prev, current; + current.setframes(d ? d->current : ai); +#ifdef _DEBUG + prev.setframes(ai); +#endif + vec *verts1 = mverts[current.fr1], *verts2 = mverts[current.fr2], *verts1p, *verts2p; + float aifrac1, aifrac2; + bool doai = d && lastmillis-d->lastanimswitchtimeprev); + verts1p = mverts[prev.fr1]; + verts2p = mverts[prev.fr2]; + aifrac1 = (lastmillis-d->lastanimswitchtime)/(float)animationinterpolationtime; + aifrac2 = 1-aifrac1; + }; for(int *command = glCommands; (*command)!=0;) { @@ -172,8 +232,15 @@ void md2::render(vec &light, int frame, int range, float x, float y, float z, fl int vn = *command++; vec &v1 = verts1[vn]; vec &v2 = verts2[vn]; - #define ip(c) v1.c*frac2+v2.c*frac1 - glVertex3f(ip(x), ip(z), ip(y)); + #define ip(v1, v2, c) (v1.c*current.frac2+v2.c*current.frac1) + #define ipv(v1, v2, c) (v1 ## p.c*prev.frac2+v2 ## p.c*prev.frac1) + #define ipa(v1, v2, c) (ip(v1, v2, c)*aifrac1+ipv(v1, v2, c)*aifrac2) + if(doai) + { + vec &v1p = verts1p[vn], &v2p = verts2p[vn]; + glVertex3f(ipa(v1, v2, x), ipa(v1, v2, z), ipa(v1, v2, y)); + } + else glVertex3f(ip(v1, v2, x), ip(v1, v2, z), ip(v1, v2, y)); }; xtraverts += numVertex; @@ -245,7 +312,7 @@ mapmodelinfo &getmminfo(int i) { return immi COMMAND(mapmodel, ARG_5STR); COMMAND(mapmodelreset, ARG_NONE); -void rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap, int basetime, bool oculling) +void rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, float y, float z, float yaw, float pitch, bool teammate, float scale, float speed, int snap, int basetime, bool oculling, dynent *d) { md2 *m = loadmodel(mdl); @@ -279,5 +346,5 @@ void rendermodel(char *mdl, int frame, int range, int tex, float rad, float x, f }; */ - m->render(light, frame, range, x, y, z, yaw, pitch, scale, speed, snap, basetime); + m->render(light, frame, range, x, y, z, yaw, pitch, scale, speed, snap, basetime, d); };