Beispiel #1
0
        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);
            }
        }
Beispiel #2
0
        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;
            }
        }
Beispiel #4
0
 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);
 }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 internal CCGeometryInstance ()
 {
     GeometryPacket = new CCGeometryPacket();
     InstanceAttributes = new CCGeometryInstanceAttributes();
 }
Beispiel #7
0
 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;
 }
Beispiel #8
0
        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);
            }

        }
Beispiel #9
0
        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);
        }
Beispiel #10
0
 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();

        }
Beispiel #13
0
        // 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();
            }
        }