CDrescher::CDrescher()
:sound(NULL),box1(NULL),box2(NULL),rolle(0.0f),speed(D3DVECTOR(0,0,0)),acc(D3DVECTOR(0,0,0)),
 rot(0.0f),schaukelphase(0.0f)
{
	statusmessage=new CMessageChain(2);
	schaukelphase=0.0f;
	Normale=IstNormale=D3DVECTOR(0,1,0);
}
Exemple #2
0
CSelectSrv::CSelectSrv():CBMWnd()
{
	m_ppxSrvBtn = NULL;
	D3DVECTOR vNorm(0, 0, -1);
    m_avBillBoard[0]  = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
    m_avBillBoard[1]  = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
    m_avBillBoard[2]  = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
    m_avBillBoard[3]  = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);
}
Exemple #3
0
//-----------------------------------------------------------------------------
// Name: D3DUtil_SetViewMatrix()
// Desc: Given an eye point, a lookat point, and an up vector, this
//       function builds a 4x4 view matrix.
//-----------------------------------------------------------------------------
HRESULT D3DUtil_SetViewMatrix( D3DMATRIX& mat, D3DVECTOR& vFrom,
                               D3DVECTOR& vAt, D3DVECTOR& vWorldUp )
{
    // Get the z basis vector, which points straight ahead. This is the
    // difference from the eyepoint to the lookat point.
    D3DVECTOR vView = vAt - vFrom;

    FLOAT fLength = Magnitude( vView );
    if( fLength < 1e-6f )
        return E_INVALIDARG;

    // Normalize the z basis vector
    vView /= fLength;

    // Get the dot product, and calculate the projection of the z basis
    // vector onto the up vector. The projection is the y basis vector.
    FLOAT fDotProduct = DotProduct( vWorldUp, vView );

    D3DVECTOR vUp = vWorldUp - fDotProduct * vView;

    // If this vector has near-zero length because the input specified a
    // bogus up vector, let's try a default up vector
    if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
    {
        vUp = D3DVECTOR( 0.0f, 1.0f, 0.0f ) - vView.y * vView;

        // If we still have near-zero length, resort to a different axis.
        if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
        {
            vUp = D3DVECTOR( 0.0f, 0.0f, 1.0f ) - vView.z * vView;

            if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
                return E_INVALIDARG;
        }
    }

    // Normalize the y basis vector
    vUp /= fLength;

    // The x basis vector is found simply with the cross product of the y
    // and z basis vectors
    D3DVECTOR vRight = CrossProduct( vUp, vView );

    // Start building the matrix. The first three rows contains the basis
    // vectors used to rotate the view to point at the lookat point
    D3DUtil_SetIdentityMatrix( mat );
    mat._11 = vRight.x;    mat._12 = vUp.x;    mat._13 = vView.x;
    mat._21 = vRight.y;    mat._22 = vUp.y;    mat._23 = vView.y;
    mat._31 = vRight.z;    mat._32 = vUp.z;    mat._33 = vView.z;

    // Do the translation values (rotations are still about the eyepoint)
    mat._41 = - DotProduct( vFrom, vRight );
    mat._42 = - DotProduct( vFrom, vUp );
    mat._43 = - DotProduct( vFrom, vView );

    return S_OK;
}
void CSprite::DrawSmooth(LPDIRECT3DDEVICE7 lpDevice,const D3DVECTOR pos,const float w,const float h,const DWORD color,const int spritenr)
{
    D3DVECTOR rightVect,upVect;
    D3DMATRIX mat;
    {
        lpDevice->GetTransform(D3DTRANSFORMSTATE_VIEW,&mat);
        rightVect=Normalize(D3DVECTOR(mat._11,mat._21,mat._31))*w*0.5f;
        upVect=Normalize(D3DVECTOR(mat._12,mat._22,mat._32))*h*0.5f;
    }

    const D3DVECTOR n=D3DVECTOR(0,0,0);
    D3DLVERTEX verts[4]=
    {
        D3DLVERTEX(pos-rightVect+upVect, color,0, 1.0f, 0.0f),
        D3DLVERTEX(pos+rightVect+upVect, color,0, 0.0f, 0.0f),
        D3DLVERTEX(pos-rightVect-upVect, color,0, 1.0f, 1.0f),
        D3DLVERTEX(pos+rightVect-upVect, color,0, 0.0f, 1.0f)
    };

    D3DUtil_SetIdentityMatrix(mat);

    lpDevice->SetTransform(D3DTRANSFORMSTATE_WORLD,&mat);

    if (Config.alpha)
    {
        lpDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE,FALSE);

        lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,   TRUE);
        lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING,FALSE);
        lpDevice->SetTextureStageState(0, D3DTSS_ALPHAARG1,         D3DTA_TEXTURE);
        lpDevice->SetTextureStageState(0, D3DTSS_ALPHAOP,           D3DTOP_SELECTARG1);
        lpDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);

        lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCCOLOR);
        lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_INVSRCCOLOR);
        lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,TRUE);
        lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAREF,0x08);
    }

    lpDevice->SetTexture(0,GetSurface(spritenr));
    lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_LVERTEX,verts,4,0);
    lpDevice->SetTexture(0,NULL);

    if (Config.alpha)
    {
        lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,   FALSE);
        lpDevice->SetRenderState(D3DRENDERSTATE_LIGHTING,TRUE);
        lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,FALSE);
        lpDevice->SetRenderState(D3DRENDERSTATE_ZWRITEENABLE,TRUE);
    }
}
Exemple #5
0
void CGolfer::Throw()
{
	CPlayer* p=(CPlayer*)parent;
	D3DMATRIX m;
	D3DVECTOR v=D3DVECTOR(0,0,2);
	D3DUtil_SetRotateYMatrix(m,-p->ang.y);
	D3DMath_VectorMatrixMultiply(v,v,m);

	pos=p->pos+v;

	if (!world->IsInside(pos))world->MakeInside(pos);
	pos.y=world->HeightAtPoint(pos.x,pos.z);
	box->SetPos(pos);

	CObject* akt=chain->GetFirst();
	while (akt)
	{
		if (GetType(akt->id)==IDStall)
		{
			Rebound(((CStall*)akt)->box);
			Rebound(((CStall*)akt)->eingang);
		}
		if (GetType(akt->id)==IDTree)
			Rebound(((CTree*)akt)->box);
		if (GetType(akt->id)==IDDrescher)
			Rebound(((CDrescher*)akt)->box2);

		akt=akt->next;
	}

	schlag.phase=0.0f;
	parent=NULL;
	ejecttime=3.0f;
}
Exemple #6
0
VOID CLightFog::Init(DWORD dwLightColor)
{
	m_dwLightColor = dwLightColor;

	for ( INT nCntY = 0; nCntY < (NUM_CNTY_LIGHTTILE+1); nCntY++ )
	{
		for ( INT nCntX = 0; nCntX < (NUM_CNTX_LIGHTTILE+1); nCntX++ )
		{
			m_avLight[nCntY][nCntX] = D3DLVERTEX(D3DVECTOR((FLOAT)(TILE_START_XPOS+(nCntX*TILE_WIDTH)), (FLOAT)(-TILE_START_YPOS-(nCntY*TILE_HEIGHT)), 0),
								  			     m_dwLightColor, RGB(0, 0, 0),  0, 0); 
		}
	}

	memcpy(m_avSaveLight, m_avLight, sizeof(D3DLVERTEX)*(NUM_CNTY_LIGHTTILE+1)*(NUM_CNTX_LIGHTTILE+1));

	// 타일폴리곤의 인덱스 생성.
    WORD* pwIndex = m_pwLightIndices;
	for ( nCntY = 0; nCntY < NUM_CNTY_LIGHTTILE; nCntY++ )
	{
		for ( INT nCntX = 0; nCntX < NUM_CNTX_LIGHTTILE; nCntX++ )
		{
			*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
			*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
			*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));
			*pwIndex++ = nCntX+((NUM_CNTX_LIGHTTILE+1)*(nCntY+1));  
			*pwIndex++ = (nCntX+1)+((NUM_CNTX_LIGHTTILE+1)*nCntY);  
			*pwIndex++ = (nCntX)+((NUM_CNTX_LIGHTTILE+1)*nCntY);
		}
	}
}
void CDrescher::HandleInput(const int mx,const int my,const int mz)
{
	acc=D3DVECTOR(0,0,0);

	// Beschl.
	if ((game->KeyDown(DIK_W))||(game->KeyDown(DIK_UP)))
	{
		if (speed.z>0.0f)acc.z=5.75f;else acc.z=7.5f;
	}
	if ((game->KeyDown(DIK_S))||(game->KeyDown(DIK_DOWN)))
	{
		if (speed.z>0.0f)acc.z=-7.0f;else acc.z=-4.0f;
	}

	acc*=game->harvesterspeed;

	rot=0.0f;
	// Drehen
	if ((game->KeyDown(DIK_A))||(game->KeyDown(DIK_LEFT)))
		if (speed.z<0.0f)rot+=1.0f;else rot-=1.0f;
	if ((game->KeyDown(DIK_D))||(game->KeyDown(DIK_RIGHT)))
		if (speed.z<0.0f)rot-=1.0f;else rot+=1.0f;

	rot*=game->harvesterrotspeed;
}
Exemple #8
0
void CRadar::DrawUI(LPDIRECT3DDEVICE7 lpDevice)
{
	if (!Enabled)return;
	if ((lpSurface==NULL)||(lpSurface->IsLost()))
	{
		UpdateSurface();
		Update();
	}

	const float w=130.0f*game->width/640.0f;
	const float h=130.0f*game->width/640.0f;

	const float x=game->width-20-w;
	const float y=game->height-20-h;
	const int c=D3DRGBA(1,1,1,0.45f);
	const float r=0.9f;
	D3DTLVERTEX v[4]={
		D3DTLVERTEX(D3DVECTOR(x,y,0),r,c,0,0,0),
		D3DTLVERTEX(D3DVECTOR(x+w,y,0),r,c,0,1,0),
		D3DTLVERTEX(D3DVECTOR(x,y+h,0),r,c,0,0,1),
		D3DTLVERTEX(D3DVECTOR(x+w,y+h,0),r,c,0,1,1)
	};

	if (Config.alpha)
	{
//		lpDevice->SetRenderState(D3DRENDERSTATE_ZENABLE,FALSE);
		lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,TRUE);
		lpDevice->SetRenderState(D3DRENDERSTATE_SRCBLEND,D3DBLEND_SRCALPHA);
		lpDevice->SetRenderState(D3DRENDERSTATE_DESTBLEND,D3DBLEND_INVSRCALPHA);
		lpDevice->SetTextureStageState(0,D3DTSS_ALPHAOP,D3DTOP_MODULATE);

		lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,TRUE);
		lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAREF,8);
		lpDevice->SetRenderState(D3DRENDERSTATE_ALPHAFUNC,D3DCMP_GREATEREQUAL);
	}

	lpDevice->SetTexture(0,lpSurface);

	lpDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,D3DFVF_TLVERTEX,v,4,0);

	lpDevice->SetTexture(0,NULL);

	lpDevice->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,0);
	lpDevice->SetRenderState(D3DRENDERSTATE_ALPHATESTENABLE,0);
//	lpDevice->SetRenderState(D3DRENDERSTATE_ZENABLE,TRUE);
}
const float CComputerBauer::GetSchussY(const float x,const float alpha)const
{
	const float c=cosf(alpha);
	const float s=sinf(alpha);
	const float v0=Magnitude(D3DVECTOR(20.0f*c,20.0f*s+3.5f,0));

	return -(game->gravity*0.7f*sqr(x))/(2*sqr(v0)*sqr(c))+x*(s/c)+3.5f*x/(v0*c);
}
Exemple #10
0
CEi::CEi(const D3DVECTOR vpos,const D3DVECTOR vang,D3DVECTOR ospeed,const D3DVECTOR opos,const BOOLEAN relativespeed,const float vspeed,const UID vowner)
:pos(vpos),ang(vang),speed(D3DVECTOR(0,0,vspeed)),owner(vowner),lpMesh(game->models->FindObject("Ei"))
{
	D3DVECTOR v;
	D3DMATRIX m,m2;
	D3DUtil_SetRotateYMatrix(m,ang.y);
	if (!relativespeed)D3DMath_VectorMatrixMultiply(ospeed,ospeed,m);
	D3DUtil_SetRotateXMatrix(m2,-ang.x);
	D3DMath_MatrixMultiply(m,m2,m);

	D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,1)+opos,m);
	pos+=v;

	D3DMath_VectorMatrixMultiply(speed,speed,m);
	speed+=ospeed;
	speed.y+=ei_offsety;
	id=MakeUID(IDEi);
}
VOID CImageHandler::InitAllImage()
{
	for ( INT nCnt = 0; nCnt < _MAX_IMAGE; nCnt++ )
		m_xImageList[nCnt].Init();

	ZeroMemory(m_nLoadedMagic, sizeof(INT)*_MAX_MAGIC);

 	D3DVECTOR vNorm(0, 0, -1);
	m_avBillBoard[0]  = D3DVERTEX(D3DVECTOR(-0.5f, 0.5f, 0), vNorm, 0, 0);
	m_avBillBoard[1]  = D3DVERTEX(D3DVECTOR(-0.5f,-0.5f, 0), vNorm, 0, 1);
	m_avBillBoard[2]  = D3DVERTEX(D3DVECTOR( 0.5f, 0.5f, 0), vNorm, 1, 0);
	m_avBillBoard[3]  = D3DVERTEX(D3DVECTOR( 0.5f,-0.5f, 0), vNorm, 1, 1);

	for ( nCnt = 0; nCnt < _MAX_TEXTR_FILE; nCnt++ )
	{
		m_xTextrFileList[nCnt].ClearAllNodes();
	}
}
const BOOLEAN CDrescher::GetIn(CPlayer* p)
{
	if (parent!=NULL)return FALSE;

	parent=(CObject*)p;
	speed=D3DVECTOR(0,0,0);

	return TRUE;
}
const D3DVECTOR CDrescher::PrivotFromCenter2(const D3DVECTOR p)const
{
	D3DMATRIX m;

	D3DUtil_SetRotateYMatrix(m,ang.y);

	D3DVECTOR v;
	D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,-1.186f),m);
	return p-v;
}
const D3DVECTOR CDrescher::GetCenter2()const 
{
	D3DMATRIX m;

	D3DUtil_SetRotateYMatrix(m,ang.y);

	D3DVECTOR v;
	D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,-1.186f),m);

	return v+pos;
}
const D3DVECTOR CDrescher::GetOutput()const
{
	D3DMATRIX m,matrix;
	D3DUtil_SetTranslateMatrix(matrix,pos);

	{	//  Mähdrescher gemäß Steigung kippen

		D3DUtil_SetRotateYMatrix(m,beta);
		D3DMath_MatrixMultiply(matrix,m,matrix);

		D3DUtil_SetRotateXMatrix(m,alpha);
		D3DMath_MatrixMultiply(matrix,m,matrix);

		D3DUtil_SetRotateYMatrix(m,-beta);
		D3DMath_MatrixMultiply(matrix,m,matrix);
	}
	
	
	D3DUtil_SetRotateYMatrix(m,ang.y);
	D3DMath_MatrixMultiply(matrix,m,matrix);

	D3DUtil_SetTranslateMatrix(m,D3DVECTOR(-1.48f,1.24f,-3.1f));
	D3DMath_MatrixMultiply(matrix,m,matrix);

	if (schaukelphase>0.0f)
	{ // schaukeln
		const float mittelpunkt=2.0f;
		D3DUtil_SetTranslateMatrix(m,0,0,-mittelpunkt);
		D3DMath_MatrixMultiply(matrix,m,matrix);
		D3DUtil_SetRotateXMatrix(m,schaukelwinkel());
		D3DMath_MatrixMultiply(matrix,m,matrix);

		D3DUtil_SetTranslateMatrix(m,0,0,mittelpunkt);
		D3DMath_MatrixMultiply(matrix,m,matrix);
	}

	D3DVECTOR v;
	D3DMath_VectorMatrixMultiply(v,D3DVECTOR(0,0,0),matrix);

	return v;
}
void CDrescher::UpdateWinkel()
{
	const D3DVECTOR back=GetCenter1();
	world->HeightAtPoint(back.x,back.z,&Normale);
	Normale=Normalize(Normale);

	if (parent==NULL)
	{
		IstNormale=Normale;
		alpha=acosf(DotProduct(IstNormale,D3DVECTOR(0,1,0)));
		beta=atan2f(IstNormale.x,IstNormale.z);
	}
}
Exemple #17
0
void DrawShadow(LPDIRECT3DDEVICE7 lpDevice)
{
    lpDevice->SetRenderState( D3DRENDERSTATE_ZENABLE,       FALSE );
    lpDevice->SetRenderState( D3DRENDERSTATE_STENCILENABLE, TRUE );

    // Turn on alphablending
    lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );

    lpDevice->SetRenderState( D3DRENDERSTATE_SRCBLEND, D3DBLEND_SRCALPHA );
    lpDevice->SetRenderState( D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA );

	lpDevice->SetTextureStageState(0,D3DTSS_ALPHAARG1,D3DTA_DIFFUSE);

    // Only write where the stencil value == 1
    lpDevice->SetRenderState( D3DRENDERSTATE_STENCILREF,  0x1 );
    lpDevice->SetRenderState( D3DRENDERSTATE_STENCILFUNC, D3DCMP_EQUAL );
    lpDevice->SetRenderState( D3DRENDERSTATE_STENCILPASS, D3DSTENCILOP_KEEP );

    // Get viewport dimensions for big, gray square
    D3DVIEWPORT7 vp;
    lpDevice->GetViewport(&vp);
    FLOAT sx = (FLOAT)vp.dwWidth;
    FLOAT sy = (FLOAT)vp.dwHeight;

	D3DCOLOR color=D3DRGBA(0,0,0,0.5f);
    // Draw a big, gray square
    D3DTLVERTEX vBigGraySquare[4];
    vBigGraySquare[0] = D3DTLVERTEX( D3DVECTOR( 0,sy,0.0f),1.0f,color,0,0,0 );
    vBigGraySquare[1] = D3DTLVERTEX( D3DVECTOR( 0, 0,0.0f),1.0f,color,0,0,0 );
    vBigGraySquare[2] = D3DTLVERTEX( D3DVECTOR(sx,sy,0.0f),1.0f,color,0,0,0 );
    vBigGraySquare[3] = D3DTLVERTEX( D3DVECTOR(sx, 0,0.0f),1.0f,color,0,0,0 );
    lpDevice->DrawPrimitive( D3DPT_TRIANGLESTRIP, D3DFVF_TLVERTEX,
                                 vBigGraySquare, 4, NULL );

    // Restore render states
    lpDevice->SetRenderState( D3DRENDERSTATE_ZENABLE,          TRUE );
    lpDevice->SetRenderState( D3DRENDERSTATE_STENCILENABLE,    FALSE );
    lpDevice->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, FALSE );
}
void CDrescher::Unbind()
{
	if (parent!=NULL)
	{
		CBauer* b=(CBauer*)parent;
		b->pos=pos;
		b->ang=ang;
		D3DMATRIX m;
		D3DVECTOR v=D3DVECTOR(0,0,-5.5f);
		D3DUtil_SetRotateYMatrix(m,b->ang.y);
		D3DMath_VectorMatrixMultiply(v,v,m);
		b->ang.y=-b->ang.y;
		b->pos+=v;
		b->object=NULL;
	}
}
const BOOLEAN CComputerBauer::SearchWeapon(const float elapsed)
{
	// Nächste Waffe in der Umgebung suchen
	ang.x=0.0f;
	CWeapon* found=NULL;
	float entf=150.0f;

	CObject* o=chain->GetFirst();
	while (o)
	{
		switch(GetType(o->id))
		{
		case IDDrescher:
		case IDPlasmaCannon:
		case IDGartenkralle:
		case IDGolfer:
			{
				CWeapon *w=(CWeapon*)o;
				if ((w->parent==NULL)&&(Magnitude(w->pos-pos)<entf))
				{
					if ((o->IsType(IDPlasmaCannon))&&(((CPlasmaCannon*)w)->munition<3))goto dochnicht;
					if ((o->IsType(IDGartenkralle))&&(((CGartenkralle*)w)->werfer!=NULL))goto dochnicht;
					
					found=w;
					entf=Magnitude(w->pos-pos);

				}
			}
			break;
		}
dochnicht:
		o=o->next;
	}
	if (found!=NULL)
	{
		float w=RotateTo(found->pos,elapsed);
		if (w<0.3f)speed.z=5.0f;else speed.z=1.5f;
		return TRUE;
	}else{
		// Keine brauchbare Waffe gefunden -> Dumm rumlaufen?
		speed=D3DVECTOR(0,0,0);
		return FALSE;
	}
}
Exemple #20
0
// Runden Schatten malen
void RenderRoundShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float r)
{
#define EDGES 12
	static D3DVERTEX v[(EDGES+1)*2];

	D3DLIGHT7 light;
	lpDevice->GetLight(0,&light);
	D3DVECTOR length=Normalize(light.dvDirection)*(-100.0f);

	for (int i=0;i<=EDGES;i++)
	{
		v[i]=v[i+EDGES+1]=D3DVERTEX(D3DVECTOR(x+sinf(float(i)/float(EDGES)*g_PI*2.0f)*r,y,z+cosf(float(i)/float(EDGES)*g_PI*2.0f)*r),D3DVECTOR(0,1,0),0,0);
		v[i+EDGES+1].x-=length.x;
		v[i+EDGES+1].y-=length.y;
		v[i+EDGES+1].z-=length.z;
	}

	static WORD wIndices[(EDGES-2)*3+EDGES*6];
	const PWORD Cap=&wIndices[0];
	const PWORD Side=&wIndices[(EDGES-2)*3];

	for (i=0;i<EDGES-2;i++)
	{
		Cap[i*3]=0;
		Cap[i*3+1]=i+1;
		Cap[i*3+2]=i+2;
	}
	for (i=0;i<EDGES;i++)
	{
		Side[i*6+0]=i;
		Side[i*6+1]=i+EDGES+2;
		Side[i*6+2]=i+1;
		Side[i*6+3]=i;
		Side[i*6+4]=i+EDGES+1;
		Side[i*6+5]=i+EDGES+2;
	}

	RenderShadow(lpDevice,v,EDGES*2+2,wIndices,sizeof(wIndices)/sizeof(wIndices[0]));
//	RenderShadow(lpDevice,v,8,wIndices,(EDGES-2)*3);
}
BOOLEAN CDrescher::Init()
{
	pos=world->Rand(4.0f);

	ang=D3DVECTOR(0,randf()*6.0f,0);

	mesh1=game->models->FindObject("Drescher");
	mesh2=game->models->FindObject("Rolle");

	id=MakeUID(IDDrescher);

	box1=new CBoundingTube(GetCenter1(),3.6f/2.0f,1.5f);
	box2=new CBoundingTube(GetCenter2(),4.2f/2.0f,1.5f);

	sound=new CSound(game->lpBuffers[16],FALSE);
	sound->Set3DParameters(pos);
	sound->SetFrequency(16000);

	game->AddSound(sound);
	sound->Play(DSBPLAY_LOOPING);

	UpdateWinkel();
	return TRUE;
}
Exemple #22
0
void RenderSquareShadow(LPDIRECT3DDEVICE7 lpDevice,float x,float y,float z,float w,float h)
{
    WORD wIndices[] = { 
		0,1,2,
		3,2,1,
		1,5,3,
		3,5,7, 
		0,4,1,
		1,4,5, 
		0,2,4,
		4,2,6, 
		2,3,6,
		6,3,7,
	};

	D3DLIGHT7 light;
	lpDevice->GetLight(0,&light);
	D3DVECTOR length=Normalize(light.dvDirection)*(-100);

	D3DVERTEX v[8];

    v[0] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 0, 1 );
    v[1] = D3DVERTEX( D3DVECTOR( x-w/2, y,  z+h/2 ),D3DVECTOR(0,1,0), 0, 0 );
    v[2] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 ),D3DVECTOR(0,1,0), 1, 1 );
    v[3] = D3DVERTEX( D3DVECTOR( x+w/2, y,  z+h/2 ),D3DVECTOR(0,1,0), 1, 0 );

    v[4] = D3DVERTEX( D3DVECTOR( x-w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 );
    v[5] = D3DVERTEX( D3DVECTOR( x-w/2, y,  z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 );
    v[6] = D3DVERTEX( D3DVECTOR( x+w/2, y, z-h/2 )-length,D3DVECTOR(0,1,0), 0, 0 );
    v[7] = D3DVERTEX( D3DVECTOR( x+w/2, y,  z+h/2 )-length,D3DVECTOR(0,1,0), 0, 0 );

	RenderShadow(lpDevice,v,8,wIndices,sizeof(wIndices)/sizeof(wIndices[0]));
}
Exemple #23
0
CEi::CEi()
:pos(D3DVECTOR(0,0,0)),ang(D3DVECTOR(0,0,0)),speed(D3DVECTOR(0,0,0)),owner(0),lpMesh(game->models->FindObject("Ei"))
{
	id=MakeUID(IDEi);
}
Exemple #24
0
// Does a lot more that just a standard begin scene, this restores the surfaces,
// erases the backbuffer, points the camara etc.
HRESULT Direct3D::BeginScene(D3DVECTOR At, // Viewer position
							 D3DVECTOR To) // Look to position
{
	// Make sure the device pointer is valid
	if(0 == D3DDevice)
		return(E_FAIL);

	// Restore any lost surfaces
	if(DDERR_SURFACELOST == PrimarySurface->IsLost())
		PrimarySurface->Restore();
	if(DDERR_SURFACELOST == BackBuffer->IsLost())
		BackBuffer->Restore();
	if(DDERR_SURFACELOST == ZBuffer->IsLost())
		ZBuffer->Restore();
	D3DTextr_RestoreAllTextures(D3DDevice);

	static HRESULT Return;

	// Set up a view matrix
	static D3DMATRIX VM;
	D3DUtil_SetViewMatrix(VM, At, To, D3DVECTOR(0, 1, 0));
	// Apply the view matrix
	Return = D3DDevice->SetTransform(D3DTRANSFORMSTATE_VIEW, &VM);
	if(FAILED(Return))
		return Return;

	// Clear the viewport if freeform is off, or just clear the ZBuffer
	// and draw a copy of the GDI surface if it is on
	if(IsFreeForm)
	{
		// clear the z-buffer
		Return = D3DDevice->Clear(0,
							   	  0,
								  D3DCLEAR_ZBUFFER,
								  0,
								  1.0f,
								  0);
		if(FAILED(Return))
			return Return;

		// Copy the screenshot onto the backbuffer
		HDC hdc, xdc;
		BackBuffer->GetDC(&hdc);
		GDIScreenShot->GetDC(&xdc);

		StretchBlt(hdc,
				   0,
				   0,
				   GetSystemMetrics(SM_CXSCREEN),
				   GetSystemMetrics(SM_CYSCREEN),
				   xdc,
				   0,
				   0,
				   GetSystemMetrics(SM_CXSCREEN),
				   GetSystemMetrics(SM_CYSCREEN),
				   SRCCOPY);

		BackBuffer->ReleaseDC(hdc);
		GDIScreenShot->ReleaseDC(xdc);
	} // end if
	else
	{
		// Just clear the viewport
		Return = D3DDevice->Clear(0,
							   	  0,
								  D3DCLEAR_ZBUFFER |
								  D3DCLEAR_TARGET,
								  FogColor,
								  1.0f,
								  0);
		if(FAILED(Return))
			return Return;
	} // end else

	// Start the scene render
	Return = D3DDevice->BeginScene();
	if(FAILED(Return))
		return Return;

	// Return success
	return(D3D_OK);
} // end Direct3D::BeginScene
void CDrescher::GetOut()
{
	parent=NULL;
	speed=acc=D3DVECTOR(0,0,0);
	sound->SetFrequency(16000);
}
Exemple #26
0
/*-------------------------------------------------------------------------------------
	メッセージハンドラ	Windowsからメッセージが来るとここにくる
---------------------------------------------------------------------------------------*/
LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
	HDC				hdc;				// デバイスコンテキスト
	PAINTSTRUCT		ps;					// 
	D3DVECTOR		v1, v2;				// ベクトル
	float			dot, ang;			// 内積計算用
	static float	angle1 = 0.0f;		// ベクトルの角度( これからベクトルを計算 )
	static float	angle2 = 0.0f;		// ベクトルの角度( これからベクトルを計算 )
	char			str[ 128];

	/*--------------------------------------------
		Windows からのメッセージにより分岐
	----------------------------------------------*/
	switch ( message ){						
	// 作成時 ---------------------------------------------------------
	case WM_CREATE:
		break;
	// ウインドウがアクティブになったとき -----------------------------
	case WM_ACTIVATE:

		// 描画する
		InvalidateRect( hwnd, NULL, TRUE );

		break;
	// キー入力関連 ----------------------------------------------------
	case WM_KEYDOWN:
        switch( wParam ){					// キーに応じて処理 
		case VK_F12:						// 強制終了ボタン
			// Windows へプログラム終了の合図
			PostMessage( hwnd, WM_CLOSE, 0, 0 );	
			break;
		/*----------------------------------
			ベクトルの回転( 角度 )
		------------------------------------*/
		case VK_UP:
			// 回転
			angle1 += 2.0f;
			break;
		case VK_DOWN:
			// 回転
			angle1 -= 2.0f;
			break;
		case VK_RIGHT:
			// 回転
			angle2 += 2.0f;
			break;
		case VK_LEFT:
			// 回転
			angle2 -= 2.0f;
			break;
		}
		// 描画する
		InvalidateRect( hwnd, NULL, TRUE );
		break;	
	// ウインドウを閉じようとするとき ----------------------------------
	case WM_CLOSE:
// 現在未使用機能 ------------
#if 0
		// メッセージボックスで終了の確認
		Dx.SetMessageBox();
		ret = MessageBox( hwnd, "ツールを終了しますか?", "確認", MB_YESNO | MB_ICONQUESTION ); 
		// いいえなら終了しない
		if( ret == IDNO )	return 0;
#endif
		break;
	// プログラム終了 --------------------------------------------------
	case WM_DESTROY:
		PostQuitMessage( 0 );
		break;
	// 描画要求を行ったとき-----------------------------------------------
	case WM_PAINT:

		// ベクトルを計算( 正規化 )
		v1 = D3DVECTOR( ( float)cos( angle1 * RD_ ), ( float)sin( angle1 * RD_ ), 0.0f );
		v2 = D3DVECTOR( ( float)cos( angle2 * RD_ ), ( float)sin( angle2 * RD_ ), 0.0f );

		// 内積を計算
		dot = v1.x * v2.x + v1.y * v2.y + v1.z * v2.z;

		// 角度を取得
		// この角度は180度までしか調べられないので注意
		ang = ( float)acos( dot ) * DEG_;

		/*------------------------------------------
			描画関連
		--------------------------------------------*/

		// 描画開始
		hdc = BeginPaint( hwnd, &ps );

		// ベクトルを描画
		LineDisp( hdc, 320, 240, 320 + ( int)( 128 * v1.x ), 240 + ( int)( 128 * v1.y ), 0xFFFFFF );

		// ベクトルを描画
		LineDisp( hdc, 320, 240, 320 + ( int)( 128 * v2.x ), 240 + ( int)( 128 * v2.y ), 0x00FF00 );

		/*------------------------------------
			操作説明
		--------------------------------------*/

		// テキストの設定
		SetTextColor( hdc, 0xFFFFFF ); 
		SetBkMode( hdc, TRANSPARENT );

		// 文字表示
		TextOut( hdc, 0,   0, "ベクトル1", 10 );
 		TextOut( hdc, 0,  16, "ベクトル2", 10 );
		// 線の種類
		LineDisp( hdc, 96, 8, 160, 8, 0xFFFFFF );
		LineDisp( hdc, 96, 24, 160, 24, 0x00FF00 );

		// 文字描画
		sprintf( str, "内積結果 = %f", dot );
 		TextOut( hdc, 0,  32, str, strlen( str ) );
		sprintf( str, "角度 = %f", ang );
 		TextOut( hdc, 0,  48, str, strlen( str ) );

		// 説明
		sprintf( str, "上下左右キーでベクトルの回転", ang );
 		TextOut( hdc, 0, 464, str, strlen( str ) );

		// 描画終了
		EndPaint( hwnd, &ps );

		break;
	// デフォルト ------------------------------------------------------
	default:

		// 通常の関数処理
		return DefWindowProc( hwnd, message, wParam, lParam);
	}

	// 通常の関数処理
	return DefWindowProc( hwnd, message, wParam, lParam);
}
Exemple #27
0
VOID CSelectSrv::Draw3DBorder(RECT rcWnd,COLORREF dwColor,INT nAlpha)
{
	if ( g_xMainWnd.Get3DDevice() )
	{
		D3DVECTOR vTrans;
		D3DMATRIX matTrans;
		D3DMATRIX matScale;
		D3DMATRIX matWorld;
		D3DMATRIX matView;
		D3DMATRIX matProj;
		D3DMATRIX matWorldOriginal;
		D3DMATERIAL7 mtrl;
		if( SUCCEEDED(g_xMainWnd.Get3DDevice()->BeginScene()))
		{
			g_xMainWnd.Get3DDevice()->GetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);

			ZeroMemory(&matView, sizeof(D3DMATRIX));
		 	D3DVECTOR vEyePt    = D3DVECTOR(0, 0, -(float)((g_xMainWnd.m_rcWindow.bottom - g_xMainWnd.m_rcWindow.top)/2));
			D3DVECTOR vLookatPt = D3DVECTOR(0, 0, 0);
			D3DVECTOR vUpVec    = D3DVECTOR(0, 1, 0);

			D3DUtil_SetViewMatrix(matView, vEyePt, vLookatPt, vUpVec);		
			D3DUtil_SetProjectionMatrix(matProj, g_PI/2, float(240.0f/320.0f), -1.0f, 1.0f);

			g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_VIEW,       &matView);
			g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_PROJECTION, &matProj);

			vTrans.x = (FLOAT)rcWnd.left - 320.0f + (rcWnd.right  - rcWnd.left)/2;
			vTrans.y = (FLOAT)-rcWnd.top + 240.0f - (rcWnd.bottom - rcWnd.top )/2;
			vTrans.z = 0;

			D3DUtil_SetTranslateMatrix(matTrans, vTrans);
			D3DUtil_SetScaleMatrix(matScale, (FLOAT)(rcWnd.right - rcWnd.left), (FLOAT)(rcWnd.bottom - rcWnd.top), 0.0f);
			D3DMath_MatrixMultiply(matWorld, matScale, matTrans);
			g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorld);

			// 임시
			D3DUtil_InitMaterial(mtrl, 
								 (FLOAT)GetRValue(dwColor)/255.0f,
								 (FLOAT)GetGValue(dwColor)/255.0f, 
								 (FLOAT)GetBValue(dwColor)/255.0f);
			mtrl.diffuse.a = nAlpha/255.0f;					// alpha value

			g_xMainWnd.Get3DDevice()->SetMaterial(&mtrl);

			g_xMainWnd.Get3DDevice()->SetRenderState( D3DRENDERSTATE_ALPHABLENDENABLE, TRUE );
			g_xMainWnd.Get3DDevice()->SetRenderState( D3DRENDERSTATE_COLORKEYENABLE, TRUE);
			g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
			g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAOP,   D3DTOP_MODULATE);
			g_xMainWnd.Get3DDevice()->SetTextureStageState(0, D3DTSS_ALPHAARG2, D3DTA_DIFFUSE);

			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND, D3DBLEND_ONE);
			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_INVSRCALPHA);

			g_xMainWnd.Get3DDevice()->SetTexture(0, NULL);
			g_xMainWnd.Get3DDevice()->DrawPrimitive(D3DPT_TRIANGLESTRIP, D3DFVF_VERTEX, m_avBillBoard, 4, NULL);

			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE, FALSE);
			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_COLORKEYENABLE, FALSE);
			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_SRCBLEND , D3DBLEND_ONE);
			g_xMainWnd.Get3DDevice()->SetRenderState(D3DRENDERSTATE_DESTBLEND, D3DBLEND_ZERO);
			g_xMainWnd.Get3DDevice()->SetTransform(D3DTRANSFORMSTATE_WORLD, &matWorldOriginal);

			g_xMainWnd.Get3DDevice()->EndScene();
		}
	}
}
Exemple #28
0
void read_n_tri_object(CHUNK *chunk)
{
	CHUNK
		*c,
		*c_point,
		*c_face,
		*c_tex;

	c = chunk->Child;
	do
	{
		if(POINT_ARRAY == c->hdr.id) c_point = c;
		else if(FACE_ARRAY == c->hdr.id) c_face = c;
		else if(TEX_VERTS == c->hdr.id) c_tex = c;

		c = c->Next;
	}
	while(c != chunk->Child);

	if(!c_point->data) return;
	WORD point_count = *(WORD*)c_point->data;
	_3DS_POINT *points = (_3DS_POINT*)((BYTE*)c_point->data + sizeof(WORD));

#if 1
	/************************************/
	for(int a = 0; a < point_count; a++)
	{
		//points[a].x *= 1.2f;
		points[a].y += 2.5f;
		//points[a].z *= 1.2f;
	}
	/************************************/
#endif

	if(!c_face->data) return;
	WORD face_count = *(WORD*)c_face->data;
	_3DS_FACE *faces = (_3DS_FACE*)((BYTE*)c_face->data + sizeof(WORD));

	WORD w = sizeof(_3DS_FACE) * face_count;

	_3DS_FACE *new_faces;
	new_faces = (_3DS_FACE*)malloc(w);
	memset(new_faces, 0, w);

	WORD i = 0, f;
	for(f = 0; f < face_count; f++)
	{
		D3DVECTOR vA = D3DVECTOR(points[faces[f].b].x, points[faces[f].b].y, points[faces[f].b].z) - D3DVECTOR(points[faces[f].a].x, points[faces[f].a].y, points[faces[f].a].z);
		D3DVECTOR vB = D3DVECTOR(points[faces[f].c].x, points[faces[f].c].y, points[faces[f].c].z) - D3DVECTOR(points[faces[f].a].x, points[faces[f].a].y, points[faces[f].a].z);
		D3DVECTOR n = Normalize(CrossProduct(Normalize(vA), Normalize(vB)));

		if((n.x <= 1.0f) && (n.x >= -1.0f) && (n.y <= 1.0f) && (n.y >= -1.0f) && (n.z <= 1.0f) && (n.z >= -1.0f))
		{
			new_faces[i].a = faces[f].a;
			new_faces[i].b = faces[f].b;
			new_faces[i].c = faces[f].c;
			new_faces[i].flag = faces[f].flag;
			i++;
		}
		else
			dwVertFixCount++;
	}

	free(c_face->data);
	c_face->data = 0;
	c_face->data_size = 0;

	w = sizeof(WORD) + sizeof(_3DS_FACE) * i;
	c_face->data = malloc(w);
	c_face->data_size = w;

	w -= sizeof(WORD);
	*(WORD*)c_face->data = i;
	memcpy((BYTE*)c_face->data + sizeof(WORD), new_faces, w);

	free(new_faces);

	if(c_face->Child)
	{
		CHUNK *chunk0 = c_face->Child;
		do
		{
			if(chunk0->data)
			{
				char sz[17];
				strcpy(sz, (char*)chunk0->data);

				free(chunk0->data);
				chunk0->data = 0;
				chunk0->data_size = 0;

				f = lstrlen(sz) + 1;
				chunk0->data_size = f + sizeof(WORD) + sizeof(WORD) * i;
				chunk0->data = malloc(chunk0->data_size);
				strcpy((char*)chunk0->data, sz);

				WORD *pw = (WORD*)((BYTE*)chunk0->data + f);
				*pw++ = i;

				for(f = 0; f < i; f++) *pw++ = f;
			}
			chunk0 = chunk0->Next;
		}
		while(chunk0 != c_face->Child);
	}
}
void CDrescher::Execute(float elapsed)
{
	if (schaukelphase>0.0f)
	{
		schaukelphase-=(elapsed*12.0f);
		if (schaukelphase<0.0f)schaukelphase=0.0f;
	}
	if (IstNormale!=Normale)
	{	// Den Mähdrescher "weich" an Untergrundsteigung anpassen
		GlattAnpassen(IstNormale.x,Normale.x,elapsed);
		GlattAnpassen(IstNormale.z,Normale.z,elapsed);

		// Y-Koordinate anpassen
		IstNormale.y=sqrtf(1-sqr(IstNormale.x)-sqr(IstNormale.z));

		alpha=acosf(DotProduct(IstNormale,D3DVECTOR(0,1,0)));
		beta=atan2f(IstNormale.x,IstNormale.z);
	}
	if (parent!=NULL)
	{
		rolle+=elapsed*5.75f;
 
		D3DMATRIX m;
		D3DVECTOR v;
		D3DUtil_SetRotateYMatrix(m,ang.y);
		D3DMath_VectorMatrixMultiply(v,speed,m);
		pos+=(v*elapsed);
		pos.y=world->HeightAtPoint(pos.x,pos.z);

		float r=box1->GetRadius()*1.2f;
		D3DVECTOR c=GetCenter1();
		c=korrigieren(c,D3DVECTOR(r,0,0));
		c=korrigieren(c,D3DVECTOR(-r,0,0));
		c=korrigieren(c,D3DVECTOR(0,0,r));
		c=korrigieren(c,D3DVECTOR(0,0,-r));
		pos=pos-GetCenter1()+c;

		UpdateBox();

		speed+=(acc*elapsed);
		speed*=powf(0.45f,elapsed);

		const float s=sqrtf(sqr(speed.x)+sqr(speed.z));
		if (rot!=0.0f)
		{
			float s2=sqrtf(s/5.0f);
			ang.y+=rot*s2*elapsed;
		}

		CPlayer* driver=(CPlayer*)parent;
		driver->pos=GetCenter1();
		driver->ang=ang;
		driver->ang.y=-driver->ang.y;

		sound->SetFrequency(ULONG(20000.0f+s*3200.0f));
		sound->Set3DParameters(pos);

		if (driver->IsLocal)
		{	// An Objekten abprallen und Position senden 
			CObject* o;
			o=chain->GetFirst();
			while (o)
			{
				if (GetType(o->id)==IDTree)
				{
					CTree* t=(CTree*)o;

					if (t->box->Collidate(box2))
					{
						pos=PrivotFromCenter2(box2->MoveOut(t->box));
						UpdateBox();
						goto weiter;
					}
				}
				if (GetType(o->id)==IDStall)
				{
					CStall* s=(CStall*)o;

					if (s->box->Collidate(box2))
					{
						pos=PrivotFromCenter2(box2->MoveOut(s->box));
						UpdateBox();
						goto weiter;
					}
				}
				if ((o->IsType(IDDrescher))&&(o!=this))
				{
					CDrescher* d=(CDrescher*)o;
					if (d->box2->Collidate(box2))
					{	
						pos=PrivotFromCenter2(box2->MoveOut(d->box2));
						UpdateBox();
						goto weiter;
					}
				}


weiter:
				o=o->next;
			}

			struct _r
			{
				D3DVECTOR pos,ang,speed;
			}r;
			r.pos=pos;
			r.ang=ang;
			r.speed=speed;

			statusmessage->Send(DPID_ALLPLAYERS,NM_NOTIFY,id,1,0,0,&r,sizeof(r),FALSE);
		}
	}else rolle+=elapsed*0.7f;

	statusmessage->Execute(elapsed);

	// Kollisionen nur bei Server checken
	if (!game->IsServer)return;


	// Kollisionen mit Hühnern testen
	CObject* o=chain->GetFirst();
	while (o)
	{
		if (GetType(o->id)==IDChicken)
		{
			CChicken* c=(CChicken*)o;
			if (c->dead!=0.0f)goto weiter2;
//			if (c->bound!=NULL)goto weiter2;

			if (parent!=NULL)if (HitRolle(c->box))
			{	// Getroffen
				schaukelphase=2*g_PI;

				c->Splat(SPLAT_NORMAL);
				((CPlayer*)parent)->HasHit(c->id);
				((CPlayer*)parent)->SendNotify(3,c->id);
				if (Config.blut)game->AddGimmick(new CDrescherBlood(id,1.5f));
				if (Config.federn)game->AddGimmick(new CDrescherFedern(id,1.5f));
				goto weiter2;
			}
			CBoundingTube* box=(parent?box1:box2);
			if (c->box->Collidate(box))	// Huhn nach ausserhalb bewegen
			{
				c->pos=c->box->MoveOut(box);
				goto weiter2;
			}
		}
weiter2:
		o=o->next;
	}
}
Exemple #30
0
//***********************************************************************************************
// 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;i<TREATZONE_CUR;i++) 
	{
		if ((treatio[i].show!=1) || (treatio[i].io==NULL)) continue;

		INTERACTIVE_OBJ * io=treatio[i].io;

		if (	(!io->obj) 
			||	(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) && (xx<ACTIVEBKG->Xsize-1) && (yy<ACTIVEBKG->Zsize-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;k<io->obj->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,&ltv[0]);
							in.sx+=s1;
							EE_RT2(&in,&ltv[1]);
							in.sz+=s1;
							EE_RT2(&in,&ltv[2]);
							in.sx-=s1;
							EE_RT2(&in,&ltv[3]);

							if ((ltv[0].sz>0.f) && (ltv[1].sz>0.f) && (ltv[2].sz>0.f))
							{
								ARX_DrawPrimitive_SoftClippZ(	&ltv[0],
															&ltv[1],
															&ltv[2],
															50.f);
								ARX_DrawPrimitive_SoftClippZ(	&ltv[0],
															&ltv[2],
															&ltv[3],
															50.f);
							}
						}
					}	
				}
				else 
				{
					for (k=0;k<io->obj->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,&ltv[0]);
							in.sx+=s1;
							EE_RT2(&in,&ltv[1]);
							in.sz+=s1;
							EE_RT2(&in,&ltv[2]);
							in.sx-=s1;
							EE_RT2(&in,&ltv[3]);
							ARX_DrawPrimitive_SoftClippZ(	&ltv[0],
															&ltv[1],
															&ltv[2],
															50.f);
							ARX_DrawPrimitive_SoftClippZ(	&ltv[0],
															&ltv[2],
															&ltv[3],
															50.f);
						}
					}
				}
			}
		
		}

	SETALPHABLEND(pd3dDevice,FALSE);
	SETZWRITE(pd3dDevice, TRUE );
	SetZBias(pd3dDevice,0);
	GDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR,ulBKGColor);
	
	if( bSoftRender ) SET_FORCE_NO_VB( bNoVB );
}