public GetHardwareVertexBuffer ( int numVertices ) : |
||
numVertices | int | |
return |
public HardwareVertexBuffer GetHardwareVertexBuffer( int numVertices )
{
if ( vertexBuffer == null )
{
// Create buffer
VertexDeclaration decl = HardwareBufferManager.Instance.CreateVertexDeclaration();
decl.AddElement(0, 0, VertexElementType.Float3, VertexElementSemantic.Position);
vertexBuffer = HardwareBufferManager.Instance.CreateVertexBuffer( decl, numVertices, BufferUsage.StaticWriteOnly, false );
// lock the vertex buffer
IntPtr ipBuf = vertexBuffer.Lock( BufferLocking.Discard );
unsafe
{
float* buffer = (float*)ipBuf.ToPointer();
for ( int i = 0; i < numVertices * 3; i++ )
buffer[ i ] = 0f;
// Set each vertex
foreach ( KeyValuePair<int, Vector3> pair in vertexOffsetMap )
{
int offset = 3 * pair.Key;
Vector3 v = pair.Value;
buffer[ offset++ ] = v.x;
buffer[ offset++ ] = v.y;
buffer[ offset ] = v.z;
}
vertexBuffer.Unlock();
}
}
return vertexBuffer;
}
/// <summary> Utility method for applying pose animation </summary> public void ApplyPoseToVertexData(Pose pose, VertexData data, float influence) { if (this.targetMode == VertexAnimationTargetMode.Hardware) { // Hardware // If target mode is hardware, need to bind our pose buffer // to a target texcoord Debug.Assert(data.HWAnimationDataList.Count == 0, "Haven't set up hardware vertex animation elements!"); // no use for TempBlendedBufferInfo here btw // Set pose target as required var hwIndex = data.HWAnimDataItemsUsed++; // If we try to use too many poses, ignore extras if (hwIndex < data.HWAnimationDataList.Count) { var animData = data.HWAnimationDataList[hwIndex]; data.vertexBufferBinding.SetBinding(animData.TargetVertexElement.Source, pose.GetHardwareVertexBuffer(data.vertexCount)); // save final influence in parametric animData.Parametric = influence; } } else { // Software Mesh.SoftwareVertexPoseBlend(influence, pose.VertexOffsetMap, data); } }