void FlushVertexArray(CCGeometryInstanceAttributes instance, int numberOfVerticies, int numberOfIndices) { if (numberOfVerticies == 0) { return; } var texture = DrawManager.XnaGraphicsDevice.Textures[0] as Texture2D; var numberIndices = instance.PrimitiveType == PrimitiveType.TriangleList ? numberOfIndices / 3 : numberOfIndices / 2; DrawManager.XnaGraphicsDevice.BlendState = instance.BlendState; basicEffect.Projection = DrawManager.ProjectionMatrix; basicEffect.View = DrawManager.ViewMatrix; basicEffect.World = Matrix.Multiply(instance.AdditionalTransform.XnaMatrix, DrawManager.WorldMatrix); basicEffect.TextureEnabled = texture != null; basicEffect.Texture = texture; foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); basicEffect.GraphicsDevice.DrawUserIndexedPrimitives( instance.PrimitiveType, verticesArray.Elements, 0, numberOfVerticies, indicesArray.Elements, 0, numberIndices); } }
void FlushVertexArray(CCGeometryInstanceAttributes instance, int numberOfVerticies, int numberOfIndices) { if (numberOfVerticies == 0) { return; } DrawManager.DrawCount++; if (DrawManager.XnaGraphicsDevice.Textures[0] == null) { basicEffect.TextureEnabled = false; } else { basicEffect.TextureEnabled = true; } DrawManager.XnaGraphicsDevice.BlendState = instance.BlendState; basicEffect.Projection = DrawManager.ProjectionMatrix; basicEffect.View = DrawManager.ViewMatrix; basicEffect.World = Matrix.Multiply(instance.AdditionalTransform.XnaMatrix, DrawManager.WorldMatrix); foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); basicEffect.GraphicsDevice.DrawUserIndexedPrimitives( instance.PrimitiveType, verticesArray.Elements, 0, numberOfVerticies, indicesArray.Elements, 0, numberOfIndices / 3); } }
void FlushVertexArray(CCGeometryInstanceAttributes instance, int numberOfVerticies, int numberOfIndices) { if (numberOfVerticies == 0) { return; } var texture = DrawManager.XnaGraphicsDevice.Textures[0] as Texture2D; var numberIndices = instance.PrimitiveType == PrimitiveType.TriangleList ? numberOfIndices / 3 : numberOfIndices / 2; DrawManager.XnaGraphicsDevice.BlendState = instance.BlendState; basicEffect.Projection = DrawManager.ProjectionMatrix; basicEffect.View = DrawManager.ViewMatrix; basicEffect.World = Matrix.Multiply(instance.AdditionalTransform.XnaMatrix, DrawManager.WorldMatrix); basicEffect.TextureEnabled = texture != null; basicEffect.Texture = texture; var vOffset = 0; // figure out how many slices we need to break the vertices into depending on // short.MaxValue. Some platforms only support short value indices. var slices = (float)Math.Ceiling(numberOfVerticies / (float)short.MaxValue); // compute the amount of vertices and indices to be rendered in a single pass var sliceOfVertices = (int)Math.Min(numberOfVerticies, short.MaxValue); var sliceOfIndices = (int)(numberIndices / (numberOfVerticies / (float)sliceOfVertices)); // If we have more than one slice then we need to increment the indices so that // the triangle is continued correctly when rendering the next slice. If not then we // will get artifacts. if (slices > 1) { sliceOfIndices++; } int slice = 0; for (; slice < slices; slice++) { foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); basicEffect.GraphicsDevice.DrawUserIndexedPrimitives( instance.PrimitiveType, verticesArray.Elements, vOffset, sliceOfVertices, indicesArray.Elements, 0, sliceOfIndices); } vOffset += sliceOfVertices + 1; sliceOfVertices = (int)Math.Min(numberOfVerticies - vOffset, short.MaxValue); sliceOfIndices = (int)(numberIndices / (numberOfVerticies / (float)sliceOfVertices)) + 1; } }
public bool Equals(CCGeometryInstanceAttributes other) { if (other == null) { return(false); } if (object.ReferenceEquals(this, other)) { return(true); } return(this.AdditionalTransform == other.AdditionalTransform && this.BlendState == other.BlendState && this.PrimitiveType == other.PrimitiveType); }
void RenderBatch() { if (batchItemList.Count == 0) return; int itemCount = batchItemList.Count; int numberOfVertices = 0, numberOfIndices = 0; for (int i = 0; i < itemCount; i++) { var item = batchItemList[i].GeometryPacket; numberOfVertices += item.NumberOfVertices; numberOfIndices += item.NumberOfIndicies; } EnsureCapacity(numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; Texture2D lastTexture = null; CCGeometryInstanceAttributes lastAttributes = new CCGeometryInstanceAttributes(); for (int i = 0; i < itemCount; i++) { var geometry = batchItemList[i]; var geometryPacket = geometry.GeometryPacket; int geometryNumberOfVertices = geometryPacket.NumberOfVertices; // if the texture changed, we need to flush and bind the new texture var shouldFlush = (geometryPacket.Texture != null && !ReferenceEquals(geometryPacket.Texture.XNATexture, lastTexture)) || lastAttributes != geometry.InstanceAttributes || numberOfVertices + geometryNumberOfVertices > short.MaxValue; if (shouldFlush) { FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; bool textureExists = (geometryPacket.Texture != null); lastTexture = textureExists ? geometryPacket.Texture.XNATexture : null; lastAttributes = geometry.InstanceAttributes; DrawManager.XnaGraphicsDevice.Textures[0] = lastTexture; DrawManager.XnaGraphicsDevice.SamplerStates[0] = textureExists ? geometryPacket.Texture.SamplerState : SamplerState.PointClamp; } int[] itemIndicies = geometryPacket.Indicies; int itemIndiciesCount = geometryPacket.NumberOfIndicies; for (int ii = 0, t = numberOfIndices; ii < itemIndiciesCount; ii++, t++) indicesArray[t] = (short)(itemIndicies[ii] + numberOfVertices); numberOfIndices += itemIndiciesCount; Array.Copy(geometryPacket.Vertices, 0, verticesArray.Elements, numberOfVertices, geometryNumberOfVertices); numberOfVertices += geometryNumberOfVertices; } FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); }
internal CCGeometryInstance () { GeometryPacket = new CCGeometryPacket(); InstanceAttributes = new CCGeometryInstanceAttributes(); }
public bool Equals(CCGeometryInstanceAttributes other) { if (other == null) { return false; } if (object.ReferenceEquals(this, other)) { return true; } return this.AdditionalTransform == other.AdditionalTransform && this.BlendState == other.BlendState && this.PrimitiveType == other.PrimitiveType; }
void FlushVertexArray(CCGeometryInstanceAttributes instance, int numberOfVerticies, int numberOfIndices) { if (numberOfVerticies == 0) return; var texture = DrawManager.XnaGraphicsDevice.Textures[0] as Texture2D; var numberIndices = instance.PrimitiveType == PrimitiveType.TriangleList ? numberOfIndices / 3 : numberOfIndices / 2; DrawManager.XnaGraphicsDevice.BlendState = instance.BlendState; basicEffect.Projection = DrawManager.ProjectionMatrix; basicEffect.View = DrawManager.ViewMatrix; basicEffect.World = Matrix.Multiply(instance.AdditionalTransform.XnaMatrix, DrawManager.WorldMatrix); basicEffect.TextureEnabled = texture != null; basicEffect.Texture = texture; foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); basicEffect.GraphicsDevice.DrawUserIndexedPrimitives( instance.PrimitiveType, verticesArray.Elements, 0, numberOfVerticies, indicesArray.Elements, 0, numberIndices); } }
void RenderBatch() { if (batchItemList.Count == 0) { return; } int itemCount = batchItemList.Count; int numberOfVertices = 0, numberOfIndices = 0; for (int i = 0; i < itemCount; i++) { var item = batchItemList[i].GeometryPacket; numberOfVertices += item.NumberOfVertices; numberOfIndices += item.NumberOfIndicies; } EnsureCapacity(numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; Texture2D lastTexture = null; CCGeometryInstanceAttributes lastAttributes = new CCGeometryInstanceAttributes(); for (int i = 0; i < itemCount; i++) { var geometry = batchItemList[i]; var geometryPacket = geometry.GeometryPacket; int geometryNumberOfVertices = geometryPacket.NumberOfVertices; // if the texture changed, we need to flush and bind the new texture var shouldFlush = (geometryPacket.Texture != null && !ReferenceEquals(geometryPacket.Texture.XNATexture, lastTexture)) || lastAttributes != geometry.InstanceAttributes || numberOfVertices + geometryNumberOfVertices > short.MaxValue; if (shouldFlush) { FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; bool textureExists = (geometryPacket.Texture != null); lastTexture = textureExists ? geometryPacket.Texture.XNATexture : null; lastAttributes = geometry.InstanceAttributes; DrawManager.XnaGraphicsDevice.Textures[0] = lastTexture; DrawManager.XnaGraphicsDevice.SamplerStates[0] = textureExists ? geometryPacket.Texture.SamplerState : SamplerState.PointClamp; } int[] itemIndicies = geometryPacket.Indicies; int itemIndiciesCount = geometryPacket.NumberOfIndicies; for (int ii = 0, t = numberOfIndices; ii < itemIndiciesCount; ii++, t++) { indicesArray[t] = (short)(itemIndicies[ii] + numberOfVertices); } numberOfIndices += itemIndiciesCount; Array.Copy(geometryPacket.Vertices, 0, verticesArray.Elements, numberOfVertices, geometryNumberOfVertices); numberOfVertices += geometryNumberOfVertices; } FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); }
internal CCGeometryInstance() { GeometryPacket = new CCGeometryPacket(); InstanceAttributes = new CCGeometryInstanceAttributes(); }
void FlushVertexArray(CCGeometryInstanceAttributes instance, int numberOfVerticies, int numberOfIndices) { if (numberOfVerticies == 0) return; DrawManager.DrawCount++; if (DrawManager.XnaGraphicsDevice.Textures[0] == null) basicEffect.TextureEnabled = false; else basicEffect.TextureEnabled = true; DrawManager.XnaGraphicsDevice.BlendState = instance.BlendState; basicEffect.Projection = DrawManager.ProjectionMatrix; basicEffect.View = DrawManager.ViewMatrix; basicEffect.World = Matrix.Multiply(instance.AdditionalTransform.XnaMatrix, DrawManager.WorldMatrix); foreach (EffectPass pass in basicEffect.CurrentTechnique.Passes) { pass.Apply(); basicEffect.GraphicsDevice.DrawUserIndexedPrimitives( instance.PrimitiveType, verticesArray.Elements, 0, numberOfVerticies, indicesArray.Elements, 0, numberOfIndices / 3); } }
// Submit the batch to the driver, typically implemented // with a call to DrawIndexedPrimitive // public virtual void Draw() { if (batchItemList.Count == 0) return; int itemCount = batchItemList.Count; int numberOfVertices = 0, numberOfIndices = 0; for (int i = 0; i < itemCount; i++) { var item = batchItemList[i].GeometryPacket; numberOfVertices += item.NumberOfVertices; numberOfIndices += item.NumberOfIndicies; } EnsureCapacity(numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; Texture2D lastTexture = null; CCGeometryInstanceAttributes lastAttributes = new CCGeometryInstanceAttributes(); for (int i = 0; i < itemCount; i++) { var geometry = batchItemList[i]; var geometryPacket = geometry.GeometryPacket; int geometryNumberOfVertices = geometryPacket.NumberOfVertices; // if the texture changed, we need to flush and bind the new texture var shouldFlush = (geometryPacket.Texture != null && !ReferenceEquals(geometryPacket.Texture.XNATexture, lastTexture)) || lastAttributes != geometry.InstanceAttributes || numberOfVertices + geometryNumberOfVertices > short.MaxValue; if (shouldFlush) { FlushVertexArray(geometry.InstanceAttributes, numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; lastTexture = (geometryPacket.Texture != null) ? geometryPacket.Texture.XNATexture : null; lastAttributes = geometry.InstanceAttributes; device.Textures[0] = lastTexture; } int[] itemIndicies = geometryPacket.Indicies; int itemIndiciesCount = geometryPacket.NumberOfIndicies; for (int ii = 0, t = numberOfIndices; ii < itemIndiciesCount; ii++, t++) indiciesArray[t] = (short)(itemIndicies[ii] + numberOfVertices); numberOfIndices += itemIndiciesCount; Array.Copy(geometryPacket.Vertices, 0, verticiesArray, numberOfVertices, geometryNumberOfVertices); numberOfVertices += geometryNumberOfVertices; } FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); if (AutoClearInstances) ClearInstances(); }
// Submit the batch to the driver, typically implemented // with a call to DrawIndexedPrimitive // public virtual void Draw() { if (batchItemList.Count == 0) { return; } int itemCount = batchItemList.Count; int numberOfVertices = 0, numberOfIndices = 0; for (int i = 0; i < itemCount; i++) { var item = batchItemList[i].GeometryPacket; numberOfVertices += item.NumberOfVertices; numberOfIndices += item.NumberOfIndicies; } EnsureCapacity(numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; Texture2D lastTexture = null; CCGeometryInstanceAttributes lastAttributes = new CCGeometryInstanceAttributes(); for (int i = 0; i < itemCount; i++) { var geometry = batchItemList[i]; var geometryPacket = geometry.GeometryPacket; int geometryNumberOfVertices = geometryPacket.NumberOfVertices; // if the texture changed, we need to flush and bind the new texture var shouldFlush = (geometryPacket.Texture != null && !ReferenceEquals(geometryPacket.Texture.XNATexture, lastTexture)) || lastAttributes != geometry.InstanceAttributes || numberOfVertices + geometryNumberOfVertices > short.MaxValue; if (shouldFlush) { FlushVertexArray(geometry.InstanceAttributes, numberOfVertices, numberOfIndices); numberOfVertices = 0; numberOfIndices = 0; lastTexture = (geometryPacket.Texture != null) ? geometryPacket.Texture.XNATexture : null; lastAttributes = geometry.InstanceAttributes; device.Textures[0] = lastTexture; } int[] itemIndicies = geometryPacket.Indicies; int itemIndiciesCount = geometryPacket.NumberOfIndicies; for (int ii = 0, t = numberOfIndices; ii < itemIndiciesCount; ii++, t++) { indiciesArray[t] = (short)(itemIndicies[ii] + numberOfVertices); } numberOfIndices += itemIndiciesCount; Array.Copy(geometryPacket.Vertices, 0, verticiesArray, numberOfVertices, geometryNumberOfVertices); numberOfVertices += geometryNumberOfVertices; } FlushVertexArray(lastAttributes, numberOfVertices, numberOfIndices); if (AutoClearInstances) { ClearInstances(); } }