ShapeData CreateShape(CollisionShape shape) { ShapeData shapeData = new ShapeData(); uint[] indices; Vector3[] vertices = CreateShape(shape, out indices); shapeData.SetVertexNormalBuffer(device, vertices); if (indices != null) { shapeData.IndexCount = indices.Length; ushort[] indices_s = CompactIndexBuffer(indices); if (indices_s != null) { shapeData.SetIndexBuffer(device, indices_s); } else { shapeData.SetIndexBuffer(device, indices); } } return shapeData; }
ShapeData InitShapeData(CollisionShape shape) { ShapeData shapeData; if (shapes.TryGetValue(shape, out shapeData) == false) { if (shape.ShapeType == BroadphaseNativeType.SoftBodyShape) { shapeData = new ShapeData(); } else { shapeData = CreateShape(shape); } // Create an initial instance data buffer for a single instance //instanceDataDesc.SizeInBytes = InstanceData.SizeInBytes; //shapeData.InstanceDataBuffer = new Buffer(device, instanceDataDesc); //shapeData.BufferBindings[1] = new VertexBufferBinding(shapeData.InstanceDataBuffer, instanceDataDesc.SizeInBytes, 0); shapes.Add(shape, shapeData); } return shapeData; }
public void UpdateSoftBody(SoftBody softBody, ShapeData shapeData) { // Could just allocate a Vector3 array here at each frame, but reusing shapeData.SoftBodyData is faster. // Probably uses more memory though. shapeData.VertexCount = softBody.GetVertexNormalData(out shapeData.SoftBodyData); shapeData.SetDynamicVertexBuffer(device, shapeData.SoftBodyData); if (softBody.Faces.Count == 0 && softBody.Tetras.Count == 0) { shapeData.PrimitiveType = PrimitiveType.LineList; } }
public void InitInstancedRender(AlignedCollisionObjectArray objects) { // Clear instance data foreach (ShapeData s in shapes.Values) { s.Instances.Clear(); } // Gather instance data int i = objects.Count - 1; for (; i >= 0; i--) { var colObj = objects[i]; var shape = colObj.CollisionShape; if (shape.ShapeType == BroadphaseNativeType.SoftBodyShape) { if (demo.IsDebugDrawEnabled) { continue; } InitSoftBodyInstance(colObj as SoftBody, shape); } else { Matrix transform; colObj.GetWorldTransform(out transform); InitRigidBodyInstance(colObj, shape, ref transform); } } foreach (KeyValuePair <CollisionShape, ShapeData> sh in shapes) { ShapeData s = sh.Value; int instanceCount = s.Instances.Count; if (s.Instances.Count == 0) { removeList.Add(sh.Key); } /* * // Is the instance buffer the right size? * if (s.InstanceDataBuffer.Description.SizeInBytes != instanceCount * InstanceData.SizeInBytes) * { * // No, recreate it * s.InstanceDataBuffer.Dispose(); * * // Remember shapes that have no instances, * // shape is removed after iteration over shapes * if (instanceCount == 0) * { * if (s.IndexBuffer != null) * s.IndexBuffer.Dispose(); * s.VertexBuffer.Dispose(); * removeList.Add(sh.Key); * continue; * } * * instanceDataDesc.SizeInBytes = instanceCount * InstanceData.SizeInBytes; * s.InstanceDataBuffer = new Buffer(device, instanceDataDesc); * s.BufferBindings[1] = new VertexBufferBinding(s.InstanceDataBuffer, InstanceData.SizeInBytes, 0); * } * * // Copy the instance data over to the instance buffer * using (var data = s.InstanceDataBuffer.Map(MapMode.WriteDiscard)) * { * data.WriteRange(s.Instances.ToArray()); * s.InstanceDataBuffer.Unmap(); * } */ } // Remove shapes that had no instances if (removeList.Count != 0) { foreach (var shape in removeList) { shapes.Remove(shape); } removeList.Clear(); } }