/*
===========================================================================
ARX FATALIS GPL Source Code
Copyright (C) 1999-2010 Arkane Studios SA, a ZeniMax Media company.
This file is part of the Arx Fatalis GPL Source Code ('Arx Fatalis Source Code').
Arx Fatalis Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public
License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Arx Fatalis Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Arx Fatalis Source Code. If not, see
.
In addition, the Arx Fatalis Source Code is also subject to certain additional terms. You should have received a copy of these
additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Arx
Fatalis Source Code. If not, please request a copy in writing from Arkane Studios at the address below.
If you have questions concerning this license or the applicable additional terms, you may contact in writing Arkane Studios, c/o
ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA.
===========================================================================
*/
//////////////////////////////////////////////////////////////////////////////////////
// @@ @@@ @@@ @@ @@@@@ //
// @@@ @@@@@@ @@@ @@ @@@@ @@@ @@@ //
// @@@ @@@@@@@ @@@ @@@@ @@@@ @@ @@@@ //
// @@@ @@ @@@@ @@@ @@@@@ @@@@@@ @@@ @@@ //
// @@@@@ @@ @@@@ @@@ @@@@@ @@@@@@@ @@@ @ @@@ //
// @@@@@ @@ @@@@ @@@@@@@@ @@@@ @@@ @@@@@ @@ @@@@@@@ //
// @@ @@@ @@ @@@@ @@@@@@@ @@@ @@@ @@@@@@ @@ @@@@ //
// @@@ @@@ @@@ @@@@ @@@@@ @@@@@@@@@ @@@@@@@ @@@ @@@@ //
// @@@ @@@@ @@@@@@@ @@@@@@ @@@ @@@@ @@@ @@@ @@@ @@@@ //
// @@@@@@@@ @@@@@ @@@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@@@ //
// @@@ @@@@ @@@@ @@@ @@@@@@@ @@@ @@@ @@@@ @@@ @@@@ @@@@@ //
//@@@ @@@@ @@@@@ @@@ @@@@@@ @@ @@@ @@@@ @@@@@@@ @@@@@ @@@@@ //
//@@@ @@@@@ @@@@@ @@@@ @@@ @@ @@ @@@@ @@@@@@@ @@@@@@@@@ //
//@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@@@@ //
//@@@ @@@@ @@@@@@@ @@@@ @@ @@ @@@@ @@@@@ @@ //
//@@@ @@@ @@@ @@@@@ @@ @@@ //
// @@@ @@@ @@ @@ STUDIOS //
//////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////
// ARX_Draw
//////////////////////////////////////////////////////////////////////////////////////
//
// Description:
// ARX-specific Drawing Funcs
//
// Updates: (date) (person) (update)
// 2001/10/14 Cyril Some Verifications
//
// Initial Code: Cyril Meynier
//
// Copyright (c) 1999-2001 ARKANE Studios SA. All rights reserved
//////////////////////////////////////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include "ARX_menu2.h"
#include
#include
#include "EERIEPoly.h"
#include "EERIEapp.h"
#include
#define _CRTDBG_MAP_ALLOC
#include
// Some external defs needing to be cleaned...
extern long DANAESIZX;
extern EERIE_3D SPRmins;
extern EERIE_3D SPRmaxs;
extern long MOVETYPE;
extern ANIM_HANDLE * herowait;
extern ANIM_HANDLE * herowalk;
extern ANIM_HANDLE * herorun;
extern EERIE_3DOBJ * eyeballobj;
extern TextureContainer * Boom;
extern bool bZBUFFER;
POLYBOOM polyboom[MAX_POLYBOOM];
extern unsigned long ulBKGColor;
extern CMenuConfig *pMenuConfig;
extern bool bSoftRender;
void EE_RT2(D3DTLVERTEX*,D3DTLVERTEX*);
bool ARX_DrawPrimitive_SoftClippZ(D3DTLVERTEX*,D3DTLVERTEX*,D3DTLVERTEX*,float _fAdd=0.f);
//***********************************************************************************************
// hum... to be checked again for performance and result quality.
//-----------------------------------------------------------------------------------------------
// VERIFIED (Cyril 2001/10/15)
//***********************************************************************************************
void ARXDRAW_DrawInterShadows(LPDIRECT3DDEVICE7 pd3dDevice)
{
bool bNoVB = false;
if( bSoftRender )
{
bNoVB = GET_FORCE_NO_VB();
SET_FORCE_NO_VB( true );
}
GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,0);
SetZBias(pd3dDevice,1);
long k;
long first=1;
for (long i=0;iobj)
|| (io->ioflags & IO_JUST_COLLIDE) )
{
continue;
}
if ((Project.hide & HIDE_NPC) && (io->ioflags & IO_NPC)) continue;
if ((Project.hide & HIDE_ITEMS) && (io->ioflags & IO_ITEM)) continue;
if ((Project.hide & HIDE_FIXINTER) && (io->ioflags & IO_FIX)) continue;
long xx,yy;
F2L((io->pos.x)*ACTIVEBKG->Xmul,&xx);
F2L((io->pos.z)*ACTIVEBKG->Zmul,&yy);
if ( (xx>=1) && (yy>=1) && (xxXsize-1) && (yyZsize-1) )
{
FAST_BKG_DATA * feg=(FAST_BKG_DATA *)&ACTIVEBKG->fastdata[xx][yy];
if(!feg->treat) continue;
}
if (!( io->ioflags & IO_NOSHADOW ) )
if ( io->show==SHOW_FLAG_IN_SCENE )
if ( !(io->ioflags & IO_GOLD) )
{
register EERIEPOLY * ep;
D3DTLVERTEX in;
D3DTLVERTEX ltv[4];
ltv[0]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.3f, 0.3f) ;
ltv[1]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.7f, 0.3f) ;
ltv[2]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.7f, 0.7f) ;
ltv[3]= D3DTLVERTEX( D3DVECTOR( 0, 0, 0.001f ), 1.f, 0, 1, 0.3f, 0.7f) ;
float s1=16.f*io->scale;
float s2=s1 * DIV2;
if (io->obj->nbgroups<=1)
{
for (k=0;kobj->nbvertex;k+=9)
{
ep=EECheckInPoly(&io->obj->vertexlist3[k].v);
if (ep!=NULL)
{
in.sy=ep->min.y-3.f;
float r=0.5f-((float)EEfabs(io->obj->vertexlist3[k].v.y-in.sy))*DIV500;
r-=io->invisibility;
r*=io->scale;
if (r<=0.f) continue;
in.sx=io->obj->vertexlist3[k].v.x-s2;
in.sz=io->obj->vertexlist3[k].v.z-s2;
long lv;
r*=255.f;
F2L(r,&lv);
ltv[0].color=ltv[1].color=ltv[2].color=ltv[3].color=0xFF000000 | lv<<16 | lv<<8 | lv;
if (first)
{
first=0;
SETZWRITE(pd3dDevice, FALSE );
SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR);
SETALPHABLEND(pd3dDevice,TRUE);
SETTC(pd3dDevice,Boom);
}
EE_RT2(&in,<v[0]);
in.sx+=s1;
EE_RT2(&in,<v[1]);
in.sz+=s1;
EE_RT2(&in,<v[2]);
in.sx-=s1;
EE_RT2(&in,<v[3]);
if ((ltv[0].sz>0.f) && (ltv[1].sz>0.f) && (ltv[2].sz>0.f))
{
ARX_DrawPrimitive_SoftClippZ( <v[0],
<v[1],
<v[2],
50.f);
ARX_DrawPrimitive_SoftClippZ( <v[0],
<v[2],
<v[3],
50.f);
}
}
}
}
else
{
for (k=0;kobj->nbgroups;k++)
{
long origin=io->obj->grouplist[k].origin;
ep=EECheckInPoly( &io->obj->vertexlist3[origin].v );
if (ep!=NULL)
{
in.sy=ep->min.y-3.f;
float r=0.8f-((float)EEfabs(io->obj->vertexlist3[origin].v.y-in.sy))*DIV500;
r*=io->obj->grouplist[k].siz;
r-=io->invisibility;
if (r<=0.f) continue;
float s1=io->obj->grouplist[k].siz*44.f;
float s2=s1*DIV2;
in.sx=io->obj->vertexlist3[origin].v.x-s2;
in.sz=io->obj->vertexlist3[origin].v.z-s2;
long lv;
r*=255.f;
F2L(r,&lv);
ltv[0].color= ltv[1].color = ltv[2].color = ltv[3].color = 0xFF000000 | lv<<16 | lv<<8 | lv;
if (first)
{
first=0;
SETZWRITE(pd3dDevice, FALSE );
SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR);
SETALPHABLEND(pd3dDevice,TRUE);
SETTC(pd3dDevice,Boom);
}
EE_RT2(&in,<v[0]);
in.sx+=s1;
EE_RT2(&in,<v[1]);
in.sz+=s1;
EE_RT2(&in,<v[2]);
in.sx-=s1;
EE_RT2(&in,<v[3]);
ARX_DrawPrimitive_SoftClippZ( <v[0],
<v[1],
<v[2],
50.f);
ARX_DrawPrimitive_SoftClippZ( <v[0],
<v[2],
<v[3],
50.f);
}
}
}
}
}
SETALPHABLEND(pd3dDevice,FALSE);
SETZWRITE(pd3dDevice, TRUE );
SetZBias(pd3dDevice,0);
GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,ulBKGColor);
if( bSoftRender ) SET_FORCE_NO_VB( bNoVB );
}
//***********************************************************************************************
// Draws a light source for EDITOR purpose...
//-----------------------------------------------------------------------------------------------
// VERIFIED (Cyril 2001/10/15)
//***********************************************************************************************
void EERIEDrawLight(LPDIRECT3DDEVICE7 pd3dDevice,EERIE_LIGHT * el)
{
// long i;
D3DTLVERTEX in;
D3DTLVERTEX center;
SETCULL(pd3dDevice,D3DCULL_NONE);
if (el!=NULL)
if (el->treat)
{
el->mins.x=999999999.f;
in.sx=el->pos.x;
in.sy=el->pos.y;
in.sz=el->pos.z;
if (ACTIVECAM->type==CAM_TOPVIEW)
EERIEDrawSprite(pd3dDevice,&in,11.f,lightsource_tc,EERIERGB(el->rgb.r,el->rgb.g,el->rgb.b),2.f);
else
{
EERIEDrawSprite(pd3dDevice,&in,11.f,lightsource_tc,EERIERGB(el->rgb.r,el->rgb.g,el->rgb.b),2.f);
memcpy(&el->mins,&SPRmins,sizeof(EERIE_3D));
memcpy(&el->maxs,&SPRmaxs,sizeof(EERIE_3D));
if (el->selected)
{
if ((el->mins.x>=-200.f) && (el->mins.x<=1000.f))
if ((el->mins.y>=-200.f) && (el->mins.y<=1000.f))
{
in.sx=el->pos.x;
in.sy=el->pos.y;
in.sz=el->pos.z;
EERIETreatPoint(&in,¢er);
if ((center.sz>0.f) && (center.sz<1000.f))
{
float t=(1.f-center.sz)*ACTIVECAM->use_focal*DIV3000;
float rad=el->fallstart*t;
EERIEDrawCircle(center.sx,center.sy,rad,0xFFFFFF00,0.0001f);
rad=el->fallend*t;
EERIEDrawCircle(center.sx,center.sy,rad,0xFFFF0000,0.0001f);
rad=el->intensity*200.f*t;
EERIEDrawCircle(center.sx,center.sy,rad,0xFF00FF00,0.0001f);
}
}
}
}
}
}
//*************************************************************************************
//*************************************************************************************
void ARXDRAW_DrawAllLights(LPDIRECT3DDEVICE7 pd3dDevice,long x0,long z0,long x1,long z1)
{
long i,tx,tz;
for (i=0;ipos.x*ACTIVEBKG->Xmul,&tx);
F2L(GLight[i]->pos.z*ACTIVEBKG->Zmul,&tz);
GLight[i]->mins.x=9999999999.f;
if ((tx>=x0) && (tx<=x1) &&
(tz>=z0) && (tz<=z1))
{
GLight[i]->treat=1;
if (ACTIVECAM->type!=CAM_TOPVIEW)
{
EERIEDrawLight(pd3dDevice,GLight[i]);
}
else EERIEDrawLight(pd3dDevice,GLight[i]);
}
}
}
}
extern INTERACTIVE_OBJ * CAMERACONTROLLER;
extern long ARX_CONVERSATION;
//*************************************************************************************
//*************************************************************************************
void ARXDRAW_DrawExternalView(LPDIRECT3DDEVICE7 pd3dDevice)
{
}
//*************************************************************************************
//*************************************************************************************
void ARXDRAW_DrawEyeBall(LPDIRECT3DDEVICE7 pd3dDevice)
{
EERIE_3D angle;
EERIE_3D pos;
EERIE_3D scale;
EERIE_RGB rgb;
float d;
if (eyeball.exist<0)
{
d=(float)(-eyeball.exist)*DIV100;
eyeball.exist++;
}
else if (eyeball.exist>2)
{
d=(float)(eyeball.exist)*DIV100;
}
else return;
angle.a = eyeball.angle.a;
angle.b=MAKEANGLE(180.f-eyeball.angle.b);
angle.g=eyeball.angle.g;
pos.x=eyeball.pos.x;
pos.y=eyeball.pos.y+eyeball.floating;
pos.z=eyeball.pos.z;
scale.x=d;
scale.y=d;
scale.z=d;
rgb.r=d;
rgb.g=d;
rgb.b=d;
SETBLENDMODE(pd3dDevice,D3DBLEND_ONE,D3DBLEND_ONE);
SETALPHABLEND(pd3dDevice,TRUE);
DrawEERIEObjEx(pd3dDevice,eyeballobj,&angle,&pos,&scale,&rgb);
}
//*************************************************************************************
//*************************************************************************************
void IncrementPolyWithNormalOutput(EERIEPOLY *_pPoly,float _fFactor,D3DTLVERTEX *_pOut)
{
if( (pMenuConfig)&&
(pMenuConfig->bForceZBias) )
{
float t0=_pPoly->norm.x*_fFactor;
float t1=_pPoly->norm.y*_fFactor;
float t2=_pPoly->norm.z*_fFactor;
_pOut[0].sx=_pPoly->v[0].sx+t0;
_pOut[0].sy=_pPoly->v[0].sy+t1;
_pOut[0].sz=_pPoly->v[0].sz+t2;
_pOut[1].sx=_pPoly->v[1].sx+t0;
_pOut[1].sy=_pPoly->v[1].sy+t1;
_pOut[1].sz=_pPoly->v[1].sz+t2;
_pOut[2].sx=_pPoly->v[2].sx+t0;
_pOut[2].sy=_pPoly->v[2].sy+t1;
_pOut[2].sz=_pPoly->v[2].sz+t2;
if(_pPoly->type&POLY_QUAD)
{
_pOut[3].sx=_pPoly->v[3].sx+_pPoly->norm2.x*_fFactor;
_pOut[3].sy=_pPoly->v[3].sy+_pPoly->norm2.y*_fFactor;
_pOut[3].sz=_pPoly->v[3].sz+_pPoly->norm2.z*_fFactor;
}
}
else
{
_pOut[0].sx=_pPoly->v[0].sx;
_pOut[0].sy=_pPoly->v[0].sy;
_pOut[0].sz=_pPoly->v[0].sz;
_pOut[1].sx=_pPoly->v[1].sx;
_pOut[1].sy=_pPoly->v[1].sy;
_pOut[1].sz=_pPoly->v[1].sz;
_pOut[2].sx=_pPoly->v[2].sx;
_pOut[2].sy=_pPoly->v[2].sy;
_pOut[2].sz=_pPoly->v[2].sz;
if(_pPoly->type&POLY_QUAD)
{
_pOut[3].sx=_pPoly->v[3].sx;
_pOut[3].sy=_pPoly->v[3].sy;
_pOut[3].sz=_pPoly->v[3].sz;
}
}
}
extern float FrameDiff;
void EE_P2(D3DTLVERTEX *in,D3DTLVERTEX *out);
void ARXDRAW_DrawPolyBoom(LPDIRECT3DDEVICE7 pd3dDevice)
{
D3DTLVERTEX ltv[4];
long i,k;
float tt;
SetZBias(pd3dDevice,8);
GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,0);
unsigned long tim = ARXTimeUL();
SETALPHABLEND(pd3dDevice,TRUE);
for ( i = 0 ; i < MAX_POLYBOOM ; i++ )
{
if ( polyboom[i].exist )
{
if ( polyboom[i].type & 128 )
{
if (polyboom[i].timecreation - FrameDiff > 0)
{
float fCalc = polyboom[i].timecreation - FrameDiff;
ARX_CHECK_ULONG( fCalc );
polyboom[i].timecreation = ARX_CLEAN_WARN_CAST_ULONG( fCalc );
}
if (polyboom[i].timecreation - FrameDiff > 0)
{
float fCalc = polyboom[i].timecreation - FrameDiff;
ARX_CHECK_ULONG( fCalc );
polyboom[i].timecreation = ARX_CLEAN_WARN_CAST_ULONG( fCalc );
}
}
float t = (float)polyboom[i].timecreation + (float)polyboom[i].tolive - (float)tim;
if ( t <= 0 )
{
polyboom[i].exist=0;
BoomCount--;
continue;
}
if (Project.hide & HIDE_BACKGROUND) continue;
else
{
long typp = polyboom[i].type;
typp &= ~128;
switch (typp)
{
case 0:
tt = (float)t / (float)polyboom[i].tolive * 0.8f;
IncrementPolyWithNormalOutput(polyboom[i].ep,2.f,ltv);
EE_RT2(<v[0],<v[0]);
EE_RT2(<v[1],<v[1]);
EE_RT2(<v[2],<v[2]);
for (k=0;k1.f)
&& (ltv[1].tu>1.f)
&& (ltv[2].tu>1.f)
&& (ltv[3].tu>1.f) )
break;
if ( (ltv[0].tv>1.f)
&& (ltv[1].tv>1.f)
&& (ltv[2].tv>1.f)
&& (ltv[3].tv>1.f) )
break;
IncrementPolyWithNormalOutput(polyboom[i].ep,2.f,ltv);
EE_RT2(<v[0],<v[0]);
EE_RT2(<v[1],<v[1]);
EE_RT2(<v[2],<v[2]);
SETTEXTUREWRAPMODE(pd3dDevice,D3DTADDRESS_CLAMP);
SETBLENDMODE(pd3dDevice,D3DBLEND_INVDESTCOLOR,D3DBLEND_ONE);
SETTC(pd3dDevice, polyboom[i].tc);
ARX_DrawPrimitive_SoftClippZ( <v[0],
<v[1],
<v[2]);
if(polyboom[i].nbvert&4)
{
EE_RT2(<v[3],<v[3]);
ARX_DrawPrimitive_SoftClippZ( <v[1],
<v[2],
<v[3]);
}
SETTEXTUREWRAPMODE(pd3dDevice, D3DTADDRESS_WRAP);
}
break;
}
}
}
}
SetZBias(pd3dDevice,0);
GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,ulBKGColor);
}
extern long TRANSPOLYSPOS;
extern EERIEPOLY * TransPol[MAX_TRANSPOL];
extern long INTERTRANSPOLYSPOS;
extern D3DTLVERTEX InterTransPol[MAX_INTERTRANSPOL][4];
extern EERIE_FACE * InterTransFace[MAX_INTERTRANSPOL];
extern TextureContainer * InterTransTC[MAX_INTERTRANSPOL];
void ARXDRAW_DrawAllInterTransPolyPos(LPDIRECT3DDEVICE7 pd3dDevice)
{
SETALPHABLEND(pd3dDevice,TRUE);
EERIEDrawnPolys+=INTERTRANSPOLYSPOS;
for (long i=0;itexid<0) continue;
if (InterTransFace[i]->facetype & POLY_DOUBLESIDED)
SETCULL(pd3dDevice,D3DCULL_NONE);
else SETCULL(pd3dDevice,D3DCULL_CW);
SETTC(pd3dDevice,InterTransTC[i]);
EERIE_FACE * ef=InterTransFace[i];
float ttt=ef->transval;
if (ttt>=2.f) //MULTIPLICATIVE
{
SETBLENDMODE(pd3dDevice,D3DBLEND_ONE,D3DBLEND_ONE);
ttt*=DIV2;
ttt+=0.5f;
InterTransPol[i][2].color=InterTransPol[i][1].color=InterTransPol[i][0].color=_EERIERGB(ttt);
}
else if (ttt>=1.f) //ADDITIVE
{
ttt-=1.f;
SETBLENDMODE(pd3dDevice,D3DBLEND_ONE,D3DBLEND_ONE);
InterTransPol[i][2].color=InterTransPol[i][1].color=InterTransPol[i][0].color=_EERIERGB(ttt);
}
else if (ttt>0.f) //NORMAL TRANS
{
ttt=1.f-ttt;
SETBLENDMODE(pd3dDevice,D3DBLEND_DESTCOLOR,D3DBLEND_SRCCOLOR);
InterTransPol[i][2].color=InterTransPol[i][1].color=InterTransPol[i][0].color=_EERIERGBA(ttt);//ttt);
}
else //SUBTRACTIVE
{
SETBLENDMODE(pd3dDevice,D3DBLEND_ZERO,D3DBLEND_INVSRCCOLOR);
ttt=1.f-ttt;
InterTransPol[i][2].color=InterTransPol[i][1].color=InterTransPol[i][0].color=_EERIERGB(ttt);
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX| D3DFVF_DIFFUSE , InterTransPol[i], 3, 0, EERIE_NOCOUNT | (bSoftRender?EERIE_USEVB:0) );
}
INTERTRANSPOLYSPOS=0;
}
extern TextureContainer * enviro;
void ARXDRAW_DrawAllTransPolysPos( LPDIRECT3DDEVICE7 pd3dDevice, long MODIF )
{
int flg_NOCOUNT_USEVB = EERIE_NOCOUNT | (bSoftRender?EERIE_USEVB:0);
SetZBias( pd3dDevice, 1 );
SETALPHABLEND( pd3dDevice, TRUE );
long i, to = 0;
register EERIEPOLY * ep;
for ( i = 0 ; i < TRANSPOLYSPOS ; i++ )
{
ep = TransPol[i];
if ( ( !( Project.hide & HIDE_BACKGROUND ) ) )
{
if ( ep->type & POLY_DOUBLESIDED ) SETCULL( pd3dDevice, D3DCULL_NONE );
else SETCULL( pd3dDevice, D3DCULL_CW );
if ( ViewMode & VIEWMODE_FLAT ) SETTC( pd3dDevice, NULL );
else SETTC( pd3dDevice, ep->tex );
if ( ep->type & POLY_QUAD ) to = 4;
else to = 3;
float ttt = ep->transval;
if ( ttt >= 2.f ) //MULTIPLICATIVE
{
SETBLENDMODE( pd3dDevice, D3DBLEND_ONE, D3DBLEND_ONE );
ttt *= DIV2;
ttt += 0.5f;
ep->tv[3].color = ep->tv[2].color = ep->tv[1].color = ep->tv[0].color = _EERIERGB( ttt );
}
else if ( ttt >= 1.f ) //ADDITIVE
{
ttt -= 1.f;
SETBLENDMODE( pd3dDevice, D3DBLEND_ONE, D3DBLEND_ONE );
ep->tv[3].color = ep->tv[2].color = ep->tv[1].color = ep->tv[0].color = _EERIERGB( ttt );
}
else if ( ttt > 0.f ) //NORMAL TRANS
{
ttt = 1.f - ttt;
SETBLENDMODE( pd3dDevice, D3DBLEND_DESTCOLOR, D3DBLEND_SRCCOLOR );
ep->tv[3].color = ep->tv[2].color = ep->tv[1].color = ep->tv[0].color = _EERIERGBA(ttt);
}
else //SUBTRACTIVE
{
SETBLENDMODE( pd3dDevice, D3DBLEND_ZERO, D3DBLEND_INVSRCCOLOR );
ttt = 1.f - ttt;
ep->tv[3].color = ep->tv[2].color = ep->tv[1].color = ep->tv[0].color = _EERIERGB( ttt );
}
EERIEDRAWPRIM( pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE , ep->tv, to, 0, bSoftRender?EERIE_USEVB:0 );
if (ep->type & POLY_LAVA)
{
pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_DESTCOLOR );
pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE );
SETALPHABLEND( pd3dDevice, TRUE );
D3DTLVERTEX verts[4];
SETTC( pd3dDevice, enviro );
ARX_CHECK(to > 0);
for ( long j = 0 ; j < to ; j++ )
{
verts[j].sx = ep->tv[j].sx;
verts[j].sy = ep->tv[j].sy;
verts[j].sz = ep->tv[j].sz;
verts[j].rhw = ep->tv[j].rhw;
verts[j].color = 0xFFFFFFFF;
verts[j].tu = ep->v[j].sx * DIV1000 + EEsin( ( ep->v[j].sx ) * DIV200 + (float) FrameTime * DIV2000 ) * DIV20;
verts[j].tv = ep->v[j].sz * DIV1000 + EEcos( (ep->v[j].sz) * DIV200 + (float) FrameTime * DIV2000 ) * DIV20;
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
for ( i = 0 ; i < to ; i++ )
{
verts[i].tu = ep->v[i].sx * DIV1000 + EEsin( ( ep->v[i].sx ) * DIV100 + (float)FrameTime * DIV2000 ) * DIV10;
verts[i].tv = ep->v[i].sz * DIV1000 + EEcos( ( ep->v[i].sz ) * DIV100 + (float)FrameTime * DIV2000 ) * DIV10;
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
for ( i = 0 ; i < to ; i++ )
{
verts[i].tu = ep->v[i].sx * DIV600 + EEsin ( ( ep->v[i].sx ) * DIV160 + (float)FrameTime * DIV2000 ) * DIV11;
verts[i].tv = ep->v[i].sz * DIV600 + EEcos ( ( ep->v[i].sz ) * DIV160 + (float)FrameTime * DIV2000 ) * DIV11;
verts[i].color = 0xFF666666;
}
pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_ZERO );
pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCCOLOR );
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
}
}
if ( ep->type & POLY_WATER )
{
pd3dDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_DESTCOLOR );
pd3dDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_ONE );
SETALPHABLEND( pd3dDevice, TRUE );
D3DTLVERTEX verts[4];
SETTC( pd3dDevice, enviro );
ARX_CHECK(to > 0);
for ( long j = 0 ; j < to ; j++ )
{
verts[j].sx = ep->tv[j].sx;
verts[j].sy = ep->tv[j].sy;
verts[j].sz = ep->tv[j].sz;
verts[j].rhw = ep->tv[j].rhw;
verts[j].color = 0xFF505050;
verts[j].tu = ep->v[j].sx * DIV1000 + EEsin( ( ep->v[j].sx ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV32;
verts[j].tv = ep->v[j].sz * DIV1000 + EEcos( ( ep->v[j].sz ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV32;
if ( ep->type & POLY_FALL ) verts[j].tv += (float)FrameTime * DIV4000;
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
for ( i = 0 ; i < to ; i++ )
{
verts[i].tu = ( ep->v[i].sx + 30.f ) * DIV1000 + EEsin( ( ep->v[i].sx + 30 ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV28;
verts[i].tv = ( ep->v[i].sz + 30.f ) * DIV1000 - EEcos( ( ep->v[i].sz + 30 ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV28;
if ( ep->type & POLY_FALL ) verts[i].tv += (float)FrameTime * DIV4000;
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
for ( i = 0 ; i < to ; i++ )
{
verts[i].tu = ( ep->v[i].sx + 60.f ) * DIV1000 - EEsin( ( ep->v[i].sx + 60 ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV40;
verts[i].tv = ( ep->v[i].sz + 60.f ) * DIV1000 - EEcos( ( ep->v[i].sz + 60 ) * DIV200 + (float)FrameTime * DIV1000 ) * DIV40;
if ( ep->type & POLY_FALL ) verts[i].tv += (float)FrameTime * DIV4000;
}
EERIEDRAWPRIM(pd3dDevice, D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX | D3DFVF_DIFFUSE, verts, to, 0, flg_NOCOUNT_USEVB );
}
}
SetZBias( pd3dDevice, 0 );
}