I have two different scenes that are put together at the end. The first scene is the interior of my ship and the second is some terrain. The ship is a mesh rendered with Evolved's Normal mapping with multiple lights. The terrain is a triangle list rendered with DrawIndexedPrimitive. The problem is that the ship's interior doesn't render correctly. It only works correctly if I don't render the terrain (at all). Even when I had a condition to stop rendering the terrain, the ship's interior still had the same issue. Here is an image and the relevant code:
The terrain code:
void TERRAINSTRUCT::Show(GAMEENGINE *GE){
D3DXMATRIX pm;
D3DXMatrixPerspectiveFovLH(&pm,
D3DX_PI/4.0f, // the horizontal field of view
SCREEN_WIDTH / SCREEN_HEIGHT, // aspect ratio
0.5f, // the near view-plane
20000); // the far view-plane
GE->d3ddev->SetTransform(D3DTS_PROJECTION, &pm);
GE->d3ddev->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_RGBA (105,105,105,105) );
GE->d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG1, D3DTA_CURRENT );
GE->d3ddev->SetTextureStageState( 1, D3DTSS_COLORARG2, D3DTA_TEXTURE );
GE->d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_MODULATE2X );
//do range0
GE->d3ddev->SetMaterial(&DefaultMatl);
GE->d3ddev->SetFVF(T_D3DFVF_CUSTOMVERTEX);
for (int z=0;z<25;z++){
for (int x=0;x<25;x++){
if (Range0_1Index[x][z].type==0){//range0
int i=Range0_1Index[x][z].index;
D3DXMATRIX wm;
D3DXMatrixIdentity(&wm);
wm(3,0)=(float(x)-12.5f)*10.0f;
wm(3,1)=-1.83f;
wm(3,2)=(float(z)-12.5f)*10.0f;
GE->d3ddev->SetTransform(D3DTS_WORLD,&wm);
GE->d3ddev->SetTexture(0,TextureList[5].Texture);
GE->d3ddev->SetTexture(1,TextureList[DetailImage].Texture);
GE->d3ddev->SetStreamSource(0, Range0[i].pVertexObject, 0, sizeof(T_D3DVERTEX));
GE->d3ddev->SetIndices(Range0[i].i_buffer);
GE->d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 121, 0, 100*2);
}
if (Range0_1Index[x][z].type==1){//range1
int i=Range0_1Index[x][z].index;
D3DXMATRIX wm;
D3DXMatrixIdentity(&wm);
wm(3,0)=(float(x)-12.5f)*10.0f;
wm(3,1)=-1.83f;
wm(3,2)=(float(z)-12.5f)*10.0f;
GE->d3ddev->SetTransform(D3DTS_WORLD,&wm);
GE->d3ddev->SetTexture(0,TextureList[5].Texture);
GE->d3ddev->SetTexture(1,TextureList[DetailImage].Texture);
GE->d3ddev->SetStreamSource(0, Range1[i].pVertexObject, 0, sizeof(T_D3DVERTEX));
GE->d3ddev->SetIndices(Range1[i].i_buffer);
GE->d3ddev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 25, 0, 16*2);
}
}
}
GE->d3ddev->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
GE->d3ddev->SetTexture(1,NULL);
GE->d3ddev->SetRenderState( D3DRS_AMBIENT, D3DCOLOR_RGBA (15,15,15,15) );
}
And here is the ship interior code:
void GAMEENGINE::RenderShipInt(){
d3ddev->SetRenderTarget(0,fpRenderSurf);
D3DXMatrixPerspectiveFovLH(&MyCamera.m_projMatrix,
D3DX_PI/4.0f, // the horizontal field of view
SCREEN_WIDTH / SCREEN_HEIGHT, // aspect ratio
0.5f, // the near view-plane
20000); // the far view-plane
d3ddev->SetRenderState(D3DRS_ALPHABLENDENABLE,false);
d3ddev->SetRenderState(D3DRS_ZWRITEENABLE, true);
d3ddev->Clear(0,
NULL,
D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER,
D3DCOLOR_ARGB(0,0,255,0),
1.0f,
0);
d3ddev->BeginScene();
d3ddev->SetTransform(D3DTS_PROJECTION, &MyCamera.m_projMatrix);
D3DXMATRIX tmp;
D3DXMatrixIdentity(&tmp);
// tmp=MyCamera.RotationMatrix;
tmp(3,0)-=MyCamera.fpPosition.x;
tmp(3,1)-=23;//MyCamera.fpPosition.y; 23
tmp(3,2)-=MyCamera.fpPosition.z;
FXManager.Effect[NormalMappingFX].FX->BeginParameterBlock();
D3DXVECTOR4 v4( 0.1f, 0.1f, 0.1f, 0 );
FXManager.Effect[NormalMappingFX].FX->SetVector("Ambient",&v4);
v4=D3DXVECTOR4(-MyCamera.fpPosition.x,0,-MyCamera.fpPosition.z,0);
FXManager.Effect[NormalMappingFX].FX->SetVector("LightPosition_1",&v4);
v4=D3DXVECTOR4(0.35f,0.3f,0.25f,0);
FXManager.Effect[NormalMappingFX].FX->SetVector("LightColor_1",&v4);
FXManager.Effect[NormalMappingFX].FX->SetFloat("LightRange_1",10);
FXManager.Effect[NormalMappingFX].FX->SetTechnique("Light1");
FXManager.Effect[NormalMappingFX].FX->SetTexture("BaseTX",TextureList[ShipTexture[1].C].Texture);
// FXManager.Effect[NormalMappingFX].FX->SetTexture("NormalTX",TextureList[ShipTexture[1].N].Texture);
FXManager.Effect[NormalMappingFX].FX->SetTexture("NormalTX",TextureList[6].Texture);
D3DXMATRIX wvp=tmp*MyCamera.m_fpViewMat*MyCamera.m_projMatrix;
FXManager.Effect[NormalMappingFX].FX->SetMatrix("WorldVP",&wvp);
FXManager.Effect[NormalMappingFX].FX->SetMatrix("World",&tmp);
FXManager.Effect[NormalMappingFX].FX->SetMatrix("ViewInv",&(MyCamera.fpRotationMatrix*MyCamera.RotationMatrix));
D3DXHANDLE H=FXManager.Effect[NormalMappingFX].FX->EndParameterBlock();
FXManager.Effect[NormalMappingFX].FX->ApplyParameterBlock(H);
UINT cPasses;
FXManager.Effect[NormalMappingFX].FX->Begin(&cPasses,0);
// d3ddev->SetTransform(D3DTS_WORLD,&tmp); don't need this
for (UINT iPass = 0; iPass < cPasses; iPass++)
{
FXManager.Effect[NormalMappingFX].FX->BeginPass(iPass);
MeshObject[ShipInt].ppMesh->DrawSubset(0);
FXManager.Effect[NormalMappingFX].FX->EndPass();
}
FXManager.Effect[NormalMappingFX].FX->End();
d3ddev->EndScene();
}
They both work just fine except that the ship's interior doesn't show the lighting properly.
By the way, when I take out the "DrawIndexedPrimitive" lines, the ship's interior renders fine......