• Advertisement

Archived

This topic is now archived and is closed to further replies.

Annoying problem

This topic is 5307 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

Hi! I have a class that loads and .x model and renders it. The load function requires an IDirect3DDevice9 object to be sent to it, this wokrs fine but when I try to use the id3d object again outside the class it fails on any commands. Is this a lost device problem or what could it be?

Share this post


Link to post
Share on other sites
Advertisement
Uhh...sample code would be nice theres not alot to go on....

Share this post


Link to post
Share on other sites
Here´s the class.


class CXModel
{
public:

HRESULT LoadXModel(IDirect3DDevice9 *p_iD3DDevice9);
HRESULT RenderXModel(void);

private:

ID3DXMesh *p_Mesh;
LPD3DXBUFFER lpd3dxMtrlBuffer;
DWORD dwNumMtrls;
D3DMATERIAL9 *p_d3dMtrls9;
LPDIRECT3DTEXTURE9 *p_iD3DMeshTextures9;


};

HRESULT CXModel::LoadXModel(IDirect3DDevice9 *p_iD3DDevice9)
{

DX_ERROR_CHK(D3DXLoadMeshFromX("Meshes\\tiger.x", D3DXMESH_SYSTEMMEM,
p_iD3DDevice9, NULL, &lpd3dxMtrlBuffer, NULL, &dwNumMtrls, &p_Mesh), "Failed to load mesh");

D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)lpd3dxMtrlBuffer->GetBufferPointer();

p_d3dMtrls9 = new D3DMATERIAL9[dwNumMtrls];
p_iD3DMeshTextures9 = new LPDIRECT3DTEXTURE9[dwNumMtrls];

for(unsigned int i = 0; i < dwNumMtrls; i++)
{
p_d3dMtrls9[i] = d3dxMaterials[i].MatD3D;
p_d3dMtrls9[i].Ambient = p_d3dMtrls9[i].Diffuse;

DX_ERROR_CHK(D3DXCreateTextureFromFile(p_iD3DDevice9,
"Meshes\\Tiger.bmp", &p_iD3DMeshTextures9[i]), "Failed to load texture subset");

}



return S_OK;
}



I call this sending my initialized device object

CXModel cModel;
cModel.LoadXModel(p_iD3DDevice9);

Share this post


Link to post
Share on other sites
You mean this?


//-----------------------------INCLUDES-------------------------------


#include<d3d9.h>
#include<d3dx9.h>
#include<windows.h>
#include"Graphics.h"
#include"CXModel.h"

//-----------------------------DEFINITIONS-------------------------------


#define DX_ERROR_CHK(function, error) if(FAILED(function)){MessageBox(NULL,error, "Something.exe",MB_OK); return E_FAIL;}
#define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_TEX1)

//-----------------------------GLOBALS-------------------------------



IDirect3DDevice9 *p_iD3DDevice9;
IDirect3D9 *p_iD3D9;
IDirect3DVertexBuffer9 *p_iD3DTerrainVertexBuffer9;
IDirect3DTexture9 *p_iD3DTerrainTexture9;

extern HWND hWnd; //Defined in WinMain.cpp

float fAngle; //Camera angle


CXModel cModel;

//---------------------------------STRUCTS/CLASSES-------------------------------


struct SCustomVertex
{
float x,y,z; //Position

float u,v; //Texture coordinates

};

//-----------------------------FUNCTIONS-------------------------------


HRESULT InitializeD3D(void)
{
p_iD3D9 = Direct3DCreate9(D3D_SDK_VERSION);

D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;


DX_ERROR_CHK(p_iD3D9->CreateDevice(D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,
hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &p_iD3DDevice9), "Failed to create device");

//-----------------------------LOAD TERRAIN OBJECTS---------------------------------------


LoadTerrain();
cModel.LoadXModel(p_iD3DDevice9);

//-----------------------------RENDER STATES----------------------------------------------


p_iD3DDevice9->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
p_iD3DDevice9->SetRenderState(D3DRS_LIGHTING, FALSE);

return S_OK;

}

HRESULT RenderScene(void)
{
p_iD3DDevice9->Clear(0,NULL,D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,255), 1.0f,0);

//-----------------------START RENDERING SCENE---------------------------------


p_iD3DDevice9->BeginScene();

SetCamera(); //Set camera position and lookat point

RenderTerrain(); //Render the base terrain


p_iD3DDevice9->EndScene();

//-----------------------STOP RENDERING SCENE----------------------------------


p_iD3DDevice9->Present(NULL,NULL,NULL,NULL);

return S_OK;

}

HRESULT LoadTerrain(void)
{
SCustomVertex sTerrainVertices[] =
{
{0.0f, 0.0f, 0.0f, 0.0f, 1.0f},
{0.0f, 0.0f, 10.0f, 0.0f, 0.0f},
{10.0f, 0.0f, 0.0f, 1.0f, 1.0f},
{10.0f, 0.0f, 10.0f, 1.0f, 0.0f},
};

DX_ERROR_CHK(p_iD3DDevice9->CreateVertexBuffer(4*sizeof(SCustomVertex), 0, D3DFVF_CUSTOMVERTEX,
D3DPOOL_DEFAULT, &p_iD3DTerrainVertexBuffer9,NULL), "Failed to create terrain vertex buffer");

VOID *p_Vertices;

DX_ERROR_CHK(p_iD3DTerrainVertexBuffer9->Lock(0,sizeof(SCustomVertex), (VOID**)&p_Vertices, 0),
"Failed to lock terrain vertex buffer");

memcpy(p_Vertices, sTerrainVertices, sizeof(sTerrainVertices));

DX_ERROR_CHK(p_iD3DTerrainVertexBuffer9->Unlock(), "Failed to unlock terrain vertex buffer");


//----------------------------------LOAD TERRAIN TEXTURE----------------------------------


D3DXCreateTextureFromFile(p_iD3DDevice9, "Textures\\Grass.bmp", &p_iD3DTerrainTexture9);

return S_OK;
}

HRESULT RenderTerrain(void)
{
p_iD3DDevice9->SetStreamSource(0,p_iD3DTerrainVertexBuffer9, 0, sizeof(SCustomVertex));
p_iD3DDevice9->SetFVF(D3DFVF_CUSTOMVERTEX);
p_iD3DDevice9->SetTexture(0, p_iD3DTerrainTexture9);
p_iD3DDevice9->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 2);

return S_OK;
}

HRESULT SetCamera(void)
{
D3DXMATRIX matView;
D3DXMatrixLookAtLH(&matView, &D3DXVECTOR3(0.0f,2.0f,-10.0f),
&D3DXVECTOR3(0.0f,0.0f,0.0f),
&D3DXVECTOR3(0.0f,1.0f,0.0f));
p_iD3DDevice9->SetTransform(D3DTS_VIEW, &matView);

D3DXMATRIX matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f);
p_iD3DDevice9->SetTransform(D3DTS_PROJECTION, &matProj);

return S_OK;
}


void ReleaseGraphics(void)
{
if(p_iD3DTerrainTexture9 != NULL)
{
p_iD3DTerrainTexture9->Release();
p_iD3DTerrainTexture9 = NULL;
}
if(p_iD3DTerrainVertexBuffer9 != NULL)
{
p_iD3DTerrainVertexBuffer9->Release();
p_iD3DTerrainVertexBuffer9 = NULL;
}
if(p_iD3DDevice9 != NULL)
{
p_iD3DDevice9->Release();
p_iD3DDevice9 = NULL;
}
if(p_iD3D9 != NULL)
{
p_iD3D9->Release();
p_iD3D9 = NULL;
}
}
void GetInput(void)
{

}

void SetupSkyBox(void)
{
}

Share this post


Link to post
Share on other sites
I dont see the problem.
What is the line inwhich the device is lost?

Share this post


Link to post
Share on other sites
Have you looked at the dx debug output in the debug tab (if you use VC++)

Share this post


Link to post
Share on other sites
Yes... the one with all the "no matching sumbols found in some.dll". It produces error strings... Get the latest debug DirectX dlls too.

Share this post


Link to post
Share on other sites
It says "First-chance exception in Something.exe (D3D9.DLL): 0xC0000005: Access Violation."

Share this post


Link to post
Share on other sites
Well finally fixed it now. Needed to reset the device. But I´m going OGL for a while so the project is on ice anyways. Thanks for the help though.




Bad Monkey Productions

[edited by - shakazed on August 13, 2003 4:42:02 PM]

Share this post


Link to post
Share on other sites

  • Advertisement