Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


#ActualL. Spiro

Posted 16 January 2013 - 05:02 PM

I understand that but a sprite is a quad and from what I thought you need 4 unique points for a quad?

This basically means you don’t understand anything your code is doing.
Your idea is that a quad is just a single 4-point primitive, but your code says a quad is a D3DPT_TRIANGLELIST with 2 triangles (3-point primitives) in it in the shape of a quadrilateral.
In other words, you copied and pasted from some tutorial without understanding any of it.
 

This is true, I currently have a large index buffer and only lock what is needed at rendering (only 2 sprites atm)

Which means only 1 of 2 things: Either you aren’t updating the correct parts or you aren’t using the correct parts.
Simple debugging techniques will tell you which is the case.

 

Should I initialize every Vertex's value of the VB to 0 on creation? Is there an easy way to do this?
 
I can only think of something like:

	if(FAILED( g_pd3dDevice->CreateVertexBuffer( s_nBatchSize * 4 * sizeof( SpriteVertex ), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, 
												 0, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
	{
		m_pVB = 0;//Prints error msg
	}

	//Initialize VB to 0
	SpriteVertex* pVertex;
	m_pVB->Lock(0, 0, (void**)&pVertex, 0);

	for(uINT i = 0; i < s_nBatchSize * 4 + 1 ; i++)
	{
		pVertex[i].vPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
		pVertex[i].Colour = 0;
		pVertex[i].u1 = 0;
		pVertex[i].v1 = 0;
	}

	m_pVB->Unlock();

That is correct (except s_nBatchSize * 4 + 1) for initializing the whole buffer with 0’s, however looking at your 2nd screenshot the invalid region is already filled with 0’s.
Meaning although this is a good idea it won’t solve your problem.
 
 

 
Was that it?
 
Still unsure on how I am loosing data, do I need to :

memcpy(pVertex, indices, sizeof(indices) / sizeof(indices[0]));

That will only copy less data than before.


L. Spiro


#2L. Spiro

Posted 16 January 2013 - 04:36 PM

I understand that but a sprite is a quad and from what I thought you need 4 unique points for a quad?

This basically means you don’t understand anything your code is doing.
Your idea is that a quad is just a single 4-point primitive, but your code says a quad is a D3DPT_TRIANGLELIST with 2 triangles (3-point primitives) in it in the shape of a quadrilateral.
In other words, you copied and pasted from some tutorial without understanding any of it.
 

This is true, I currently have a large index buffer and only lock what is needed at rendering (only 2 sprites atm)

Which means only 1 of 2 things: Either you aren’t updating the correct parts or you aren’t using the correct parts.
Simple debugging techniques will tell you which is the case.

 

Should I initialize every Vertex's value of the VB to 0 on creation? Is there an easy way to do this?
 
I can only think of something like:

	if(FAILED( g_pd3dDevice->CreateVertexBuffer( s_nBatchSize * 4 * sizeof( SpriteVertex ), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, 
												 0, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
	{
		m_pVB = 0;//Prints error msg
	}

	//Initialize VB to 0
	SpriteVertex* pVertex;
	m_pVB->Lock(0, 0, (void**)&pVertex, 0);

	for(uINT i = 0; i < s_nBatchSize * 4 + 1 ; i++)
	{
		pVertex[i].vPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
		pVertex[i].Colour = 0;
		pVertex[i].u1 = 0;
		pVertex[i].v1 = 0;
	}

	m_pVB->Unlock();
 

That is correct for initializing the whole buffer with 0’s, however looking at your 2nd screenshot the invalid region is already filled with 0’s.
Meaning although this is a good idea it won’t solve your problem.
 
 

 
Was that it?
 
Still unsure on how I am loosing data, do I need to :

memcpy(pVertex, indices, sizeof(indices) / sizeof(indices[0]));

That will only copy less data than before.


L. Spiro


#1L. Spiro

Posted 16 January 2013 - 03:13 AM

I understand that but a sprite is a quad and from what I thought you need 4 unique points for a quad?
This basically means you don’t understand anything your code is doing.
Your idea is that a quad is just a single 4-point primitive, but your code says a quad is a D3DPT_TRIANGLELIST with 2 triangles (3-point primitives) in it in the shape of a quadrilateral.
In other words, you copied and pasted from some tutorial without understanding any of it.

This is true, I currently have a large index buffer and only lock what is needed at rendering (only 2 sprites atm)
Which means only 1 of 2 things: Either you aren’t updating the correct parts or you aren’t using the correct arts.
Simple debugging techniques will tell you which is the case.


Should I initialize every Vertex's value of the VB to 0 on creation? Is there an easy way to do this?
 
I can only think of something like:

	if(FAILED( g_pd3dDevice->CreateVertexBuffer( s_nBatchSize * 4 * sizeof( SpriteVertex ), D3DUSAGE_DYNAMIC | D3DUSAGE_WRITEONLY, 
												 0, D3DPOOL_DEFAULT, &m_pVB, NULL ) ) )
	{
		m_pVB = 0;//Prints error msg
	}

	//Initialize VB to 0
	SpriteVertex* pVertex;
	m_pVB->Lock(0, 0, (void**)&pVertex, 0);

	for(uINT i = 0; i < s_nBatchSize * 4 + 1 ; i++)
	{
		pVertex[i].vPos = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
		pVertex[i].Colour = 0;
		pVertex[i].u1 = 0;
		pVertex[i].v1 = 0;
	}

	m_pVB->Unlock();
 


That is correct for initializing the whole buffer with 0’s, however looking at your 2nd screenshot the invalid region is already filled with 0’s.
Meaning although this is a good idea it won’t solve your problem.
 
 
 
Was that it?
 
Still unsure on how I am loosing data, do I need to :

memcpy(pVertex, indices, sizeof(indices) / sizeof(indices[0]));


That will only copy less data than before.


L. Spiro

PARTNERS