markbiddlecom
Member
Hi, all!
This is what should be a relatively easy question (I hope). Ive got a texture loaded that contains several frames of an animation Id like to place on a sprite.
My vertex format is Position and Texture1, and is defined by the following structure:
[VB]
Public Structure Vertex
x As Single
y As Single
z As Single
tu As Single
tv As Single
End Structure
[/VB]
What Id like to be able to do is transform the texture coordinates in real-time to produce the animation effect.
So, my drawing code (very much abbreviated) looks like this (where m_buffer is a VertexBuffer object storing my sprite coordinates, and m_texture is an instance of the Texture class that contains the entire animation):
[VB]
Public Sub draw(ByVal device As Direct3D.Device)
device.VertexFormat = VertexFormats.Position Or _
VertexFormats.Texture1
device.SetTexture(0, m_texture)
device.TextureState(0).TextureTransform = _
TextureTransform.Count2
Transform the world coordinates
device.Transform.World = getSpriteMatrix()
Transform the texture coordinates
device.Transform.Texture0 = getTextureMatrix()
Draw.
device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2)
End Sub
Private Function getTextureMatrix() As Matrix
Dim retVal As Matrix = Matrix.Identity
Determine the current frame...
<code removed>
retVal = Matrix.Multiply _
(retVal, _
Matrix.Scaling(curFrameWidth, curFrameHeight, 0) _
)
retVal = Matrix.Multiply _
(retVal, _
Matrix.Translation(curFrameLeft, curFrameTop, 0) _
)
Return retVal
End Function
[/VB]
Some more information: My vertex buffer contains four verticies, defined as such:
(0,0)
(1,0)
(0,1)
(1,1)
Note that all z values are zero, and that the tu and tv coordinates are identical to the x and y coordinates.
When I run the program, I notice that the texture coordinates properly scale, but they never seem to translate, and always anchor themselves to the texture origin.
I just now realized that I probably need to set the translation coordinates in the 3rd row instead of the 4th, since texture coordinates are 2D...
<edits code>
Well, that didnt work either: now, every other frame (when I perform the texture translation) I get a blank image, instead of my picture of water. Previously, I was just getting the same frame over and over.
The new code looks like this:
[VB]
Private Function getTextureMatrix() As Matrix
Dim retVal As Matrix = Matrix.Identity
Determine the current frame...
<code removed>
retVal = Matrix.Multiply _
(retVal, _
Matrix.Scaling(curFrameWidth, curFrameHeight, 0) _
)
retVal.M31 = curFrameLeft
retVal.M32 = curFrameTop
Return retVal
End Function
[/VB]
OK, so I still need help on how to properly translate texture coordinates.
Thanks in advance!
-Mark
This is what should be a relatively easy question (I hope). Ive got a texture loaded that contains several frames of an animation Id like to place on a sprite.
My vertex format is Position and Texture1, and is defined by the following structure:
[VB]
Public Structure Vertex
x As Single
y As Single
z As Single
tu As Single
tv As Single
End Structure
[/VB]
What Id like to be able to do is transform the texture coordinates in real-time to produce the animation effect.
So, my drawing code (very much abbreviated) looks like this (where m_buffer is a VertexBuffer object storing my sprite coordinates, and m_texture is an instance of the Texture class that contains the entire animation):
[VB]
Public Sub draw(ByVal device As Direct3D.Device)
device.VertexFormat = VertexFormats.Position Or _
VertexFormats.Texture1
device.SetTexture(0, m_texture)
device.TextureState(0).TextureTransform = _
TextureTransform.Count2
Transform the world coordinates
device.Transform.World = getSpriteMatrix()
Transform the texture coordinates
device.Transform.Texture0 = getTextureMatrix()
Draw.
device.DrawPrimitives(PrimitiveType.TriangleStrip, 0, 2)
End Sub
Private Function getTextureMatrix() As Matrix
Dim retVal As Matrix = Matrix.Identity
Determine the current frame...
<code removed>
retVal = Matrix.Multiply _
(retVal, _
Matrix.Scaling(curFrameWidth, curFrameHeight, 0) _
)
retVal = Matrix.Multiply _
(retVal, _
Matrix.Translation(curFrameLeft, curFrameTop, 0) _
)
Return retVal
End Function
[/VB]
Some more information: My vertex buffer contains four verticies, defined as such:
(0,0)
(1,0)
(0,1)
(1,1)
Note that all z values are zero, and that the tu and tv coordinates are identical to the x and y coordinates.
When I run the program, I notice that the texture coordinates properly scale, but they never seem to translate, and always anchor themselves to the texture origin.
I just now realized that I probably need to set the translation coordinates in the 3rd row instead of the 4th, since texture coordinates are 2D...
<edits code>
Well, that didnt work either: now, every other frame (when I perform the texture translation) I get a blank image, instead of my picture of water. Previously, I was just getting the same frame over and over.
The new code looks like this:
[VB]
Private Function getTextureMatrix() As Matrix
Dim retVal As Matrix = Matrix.Identity
Determine the current frame...
<code removed>
retVal = Matrix.Multiply _
(retVal, _
Matrix.Scaling(curFrameWidth, curFrameHeight, 0) _
)
retVal.M31 = curFrameLeft
retVal.M32 = curFrameTop
Return retVal
End Function
[/VB]
OK, so I still need help on how to properly translate texture coordinates.
Thanks in advance!
-Mark