Jump to content
  • Advertisement
Sign in to follow this  
Sync Views

Rotating a quad in D3D

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

Ive got this function for drawing a sprite. However how should I go about rotating it around the sprite[id].offset_x and sprite[id].offset_y point?
void draw_sprite(const int id, float x, float y, D3DCOLOR c1 = c_white, D3DCOLOR c2 = NULL, D3DCOLOR c3 = NULL, D3DCOLOR c4 = NULL)
{
	if (c4 == NULL)
	{
		c2 = c1;
		c3 = c1;
		c4 = c1;
	}

	x -= 0.5f + sprite[id].offset_x;
	y -= 0.5f + sprite[id].offset_y;

	cgm::d3d_vertex* vertices;
	cgm::d3d_vertex_buffer->Lock(0, 0, (void**)&vertices, NULL);

	vertices[0].colour = c1;
	vertices[0].x = x;
	vertices[0].y = y;
	vertices[0].z = 0.0;
	vertices[0].rhw = 1.0;
	vertices[0].u = 0.0;
	vertices[0].v = 0.0;

	vertices[1].colour = c2;
	vertices[1].x = x  + sprite[id].w;
	vertices[1].y = y;
	vertices[1].z = 0.0;
	vertices[1].rhw = 1.0;
	vertices[1].u = 1.0;
	vertices[1].v = 0.0;

	vertices[2].colour = c3;
	vertices[2].x = x + sprite[id].w;
	vertices[2].y = y + sprite[id].h;
	vertices[2].z = 0.0;
	vertices[2].rhw = 1.0;
	vertices[2].u = 1.0;
	vertices[2].v = 1.0;

	vertices[3].colour = c4;
	vertices[3].x = x;
	vertices[3].y = y + sprite[id].h;
	vertices[3].z = 0.0;
	vertices[3].rhw = 1.0;
	vertices[3].u = 0.0;
	vertices[3].v = 1.0;

	cgm::d3d_vertex_buffer->Unlock();
	cgm::d3d_device->SetTexture (0, sprite[id].image);
	cgm::d3d_device->DrawPrimitive (D3DPT_TRIANGLEFAN, 0, 2);
}

Share this post


Link to post
Share on other sites
Advertisement
For your purposes, you're probably better off using a D3DXSprite rather than a textured quad. The D3DXSprite supports setting a hotspot which will be the focal point for any rotations you perform on it. It also maintains its own transform matrix so you don't have to set the world transform for the device to get it where you want on the screen. Toymaker has a nice tutorial on it. Hope that helps.

Share this post


Link to post
Share on other sites
Unrelated to your question, but using NULL to represent a D3DCOLOR is not a good way to represent an invalid color - NULL assigned to a D3DCOLOR would equal transparent if alpha blending, or black if not.

I'd handle your situation here with function overloads:


void draw_sprite(const int id, float x, float y, D3DCOLOR c1, D3DCOLOR c2, D3DCOLOR c3, D3DCOLOR c4)
{
// your function, but assume all four colors valid
}

void draw_sprite(const int id, float x, float y, D3DCOLOR c1=c_white)
{
draw_sprite(id,x,y,c1,c1,c1,c1);
}


That gives you rougly the same functionality, but allows you to pass transparent or black as a valid color.

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

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

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!