Jump to content
  • Advertisement

Archived

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

Carandiru

Code Help!! I must be tired...

This topic is 5845 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

I''m having troubles with access to certain classes, and unresolved externals. Scene.h + Scene.cpp are my files front end to the common files framework of direct3d (d3dapp.cpp, d3dutil.cpp, etc.) I have that part working fine! Then I created graphix.h and graphix.cpp, with holds functions for locking/unlocking vertex/index buffers. But they don''t have access to d3dapp.cpp and then can resolve m_pd3dDevice. Here are some *snippets* for your further understanding.
  
//Scene.h

#ifndef SCENE_H
#define SCENE_H

#include <stdio.h>
#include <math.h>
#include <d3dx8.h>
#include "Graphix.h"
#include "D3DCommon\D3DApp.h"
#include "D3DCommon\D3DFont.h"
#include "D3DCommon\D3DUtil.h"
#include "D3DCommon\DXUtil.h"
#include "MetaBallCode\MarchingCubes.h"
#include "MetaBallCode\Metaballs.h"

class cScene : public CD3DApplication
{
	// Font for drawing text

    CD3DFont* m_pFont;
    CD3DFont* m_pFontSmall;

	// Class for Quick Graphics Functions

	cGraphix* m_pGfx;
	
	// Class for Metaballs Code

	CMetaballs *m_pMetaballs;

	// Scene

	LPDIRECT3DVERTEXBUFFER8 m_pVB;			// Buffer to hold vertices

	IDirect3DTexture8 *m_pTexture;			// Texture Resource

//Scene.cpp

// Create buffers

  hr = m_pGfx->CreateVertexBuffer(MAX_VERTICES, sizeof(SVertex), 
		                          FVF_VERTEX, D3DPOOL_DEFAULT);
  if( FAILED(hr) )
	return E_FAIL;

  hr = m_pGfx->CreateIndexBuffer(MAX_INDICES, D3DPOOL_DEFAULT);
  if( FAILED(hr) )
	return E_FAIL;
  
The above works fine and those files compile great, but when it comes to graphix.cpp and graphix.h they don''t have access correctly.
  
//Graphix.h

#include <d3d8.h>

class cGraphix
{
public:
	cGraphix(); // Constructor

    static cGraphix *GetInstance();

	HRESULT CreateVertexBuffer(UINT nLenght, UINT nVertexSize, DWORD FVF, D3DPOOL Pool);
	int     LockVertexBuffer(UINT nVertices, BYTE **ppVertices);
	void    UnlockVertexBuffer();

	HRESULT CreateIndexBuffer(UINT nLength, D3DPOOL Pool);
	int     LockIndexBuffer(UINT nIndices, BYTE **ppIndices);
	void    UnlockIndexBuffer();
	void    SetIndexOffset(UINT nOffset);

	IDirect3D8       *GetD3D();
	IDirect3DDevice8 *GetD3DDevice();
//Graphix.cpp

#include "graphix.h"

// Initialize static member

cGraphix *cGraphix::m_pGraphics = 0;

//=============================================================================

cGraphix::cGraphix()
{
	m_pVertexBuffer = 0;
	m_pIndexBuffer  = 0;

	m_pGraphics  = this;
}

//=============================================================================

cGraphix *cGraphix::GetInstance()
{
	return m_pGraphics;
}
//=============================================================================

IDirect3D8 *cGraphix::GetD3D()
{
	return m_pd3d;
}

//=============================================================================

IDirect3DDevice8 *cGraphix::GetD3DDevice()
{
	return m_pd3dDevice;
}

//=============================================================================

HRESULT cGraphix::CreateVertexBuffer(UINT nLength, UINT nVertexSize, 
									  DWORD FVF, D3DPOOL Pool)
{
	HRESULT hr;

	hr = m_pd3dDevice->CreateVertexBuffer(nLength*nVertexSize,
                             D3DUSAGE_DYNAMIC|D3DUSAGE_WRITEONLY, FVF,
                             Pool, &m_pVertexBuffer);
	if( FAILED(hr) )
		return E_FAIL;

	// Prepare for rendering with this vertex buffer

	m_pd3dDevice->SetStreamSource(0, m_pVertexBuffer, nVertexSize);
	m_pd3dDevice->SetVertexShader(FVF);
	
	m_nVertexSize   = nVertexSize;
	m_nUsedVertices = nLength;
	m_nMaxVertices  = nLength;

	return S_OK;
}
  
Can someone please tell me what im doing wrong please, I really need the help here. I have tried giving graphix.h access to #include "D3DCommon\D3DApp.h" #include "D3DCommon\D3DFont.h" #include "D3DCommon\D3DUtil.h" #include "D3DCommon\DXUtil.h" and then supplying class cGraphix : public CD3DApplication but that doesn''t work, mind you everything compiles, but the program gives a memory access error, and I think im duplicating the device variables and accessing one and not the true one. Ah so mind boggling! Please help me! -Carandiru

Share this post


Link to post
Share on other sites
Advertisement
Your cGraphix class looks like a singleton. However it is not a singleton. It looks like that at initialisation you create a new cGraphix class. On the second call of the cGraphix class, a second instance of cGraphix is created but the first would not be released and the static member is overwritten with the adress of the second instance !
A correct singleton implementation is:

    
class cGraphix {
private:
static cGraphix* instance; //from your code exerpt, I do not know if you declared the instance static

cGraphix(void): m_pVertexBuffer(0), m_pIndexBuffer(0);

public:
static cGraphix* GetInstance(void);
}

cGraphix* cGraphix::instance = 0;

cGraphix* cGraphix::GetInstance(void)
{
if (instance == 0) //this is what your code seems to lack

instance = new cGraphix();
return instance;
}


Then the singleton call from your scene object is:


        
Scene::Scene(void)
{
m_pGfx = cGraphix::GetInstance();
}


Hope that helps.
Ghostly yours,
Red.

Edit: put the constructor in the private part of cGraphix class where it should be.

[edited by - Red Ghost on July 16, 2002 3:32:48 AM]

Share this post


Link to post
Share on other sites

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!