public TerrainPatchBuilder( )
        {
            int numVertices = 0;
            for ( int level = 0; level < MaxLodLevels; ++level )
            {
                numVertices += LevelPoolSize( level ) * NumberOfLevelVertices( level );
            }

            VertexBufferFormat format = new VertexBufferFormat( );
            format.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );
            format.Add( VertexFieldSemantic.Normal, VertexFieldElementTypeId.Float32, 3 );

            GraphicsLog.Info( "Allocating terrain patch builder VBO: {0} vertices in format {1}", numVertices, format );

            m_Buffer = Graphics.Factory.CreateVertexBuffer( );
            m_Buffer.Create( format, numVertices );

            int curVertexIndex = 0;
            for ( int level = 0; level < MaxLodLevels; ++level )
            {
                Lod newLod = new Lod( );
                m_LodLevels[ level ] = newLod;

                int numLevelVertices = NumberOfLevelVertices( level );
                int poolSize = LevelPoolSize( level );
                for ( int poolIndex = 0; poolIndex < poolSize; ++poolIndex )
                {
                    newLod.VbPool.Add( curVertexIndex );
                    curVertexIndex += numLevelVertices;
                }
                //	NOTE: BP: BABY P SAYS HELLO
            }
        }
 /// <summary>
 /// Creates the underlying vertex buffer whose memory will be managed by this class
 /// </summary>
 public void Create( VertexBufferFormat format, int numVertices )
 {
     m_Vb.Create( format, numVertices );
     m_FreeList.Clear( );
     m_FreeList.Add( new FreeRange( 0, numVertices ) );
     m_Handles.Clear( );
 }
Ejemplo n.º 3
0
        public SeaMesh( float width, float depth )
        {
            VertexBufferFormat vbFormat = new VertexBufferFormat( );
            vbFormat.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );
            vbFormat.Add( VertexFieldSemantic.Normal, VertexFieldElementTypeId.Float32, 3 );

            m_Vertices = Graphics.Factory.CreateVertexBuffer( );
        }
 /// <summary>
 /// Initializes static members of the <see cref="VertexPositionW"/> struct.
 /// </summary>
 static VertexPositionW()
 {
     VertexFormat = new VertexBufferFormat(new VertexElementProperties[]
     {
         new VertexElementProperties(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
         new VertexElementProperties(12, VertexElementFormat.Single, VertexElementUsage.Normal, 0)
     });
 }
Ejemplo n.º 5
0
 /// <summary>
 /// Initializes static members of the <see cref="VertexPositionW"/> struct.
 /// </summary>
 static VertexPositionW()
 {
     VertexFormat = new VertexBufferFormat(new VertexElementProperties[]
         {
             new VertexElementProperties(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
             new VertexElementProperties(12, VertexElementFormat.Single, VertexElementUsage.Normal, 0)
         });
 }
 /// <summary>
 /// Initializes static members of the <see cref="VertexPositionDualTexture"/> struct.
 /// </summary>
 static VertexPositionDualTexture()
 {
     VertexFormat = new VertexBufferFormat(new VertexElementProperties[]
         {
             new VertexElementProperties(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
             new VertexElementProperties(16, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0),
             new VertexElementProperties(24, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 1),
         });
 }
 /// <summary>
 /// Setup constructor
 /// </summary>
 public VertexBufferBuilder( VertexBufferFormat format )
 {
     Arguments.CheckNotNull( format, "format" );
     format.ValidateFormat( );
     m_Format = format;
     foreach ( VertexBufferFormat.FieldDescriptor field in format.FieldDescriptors )
     {
         m_Streams.Add( field.Field, new List<float>( ) );
     }
 }
 /// <summary>
 /// Initializes static members of the <see cref="VertexNormalMapping" /> struct.
 /// </summary>
 static VertexNormalMapping()
 {
     VertexFormat = new VertexBufferFormat(new VertexElementProperties[]
         {
             new VertexElementProperties(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
             new VertexElementProperties(12, VertexElementFormat.Vector3, VertexElementUsage.Normal, 0),
             new VertexElementProperties(24, VertexElementFormat.Vector3, VertexElementUsage.Binormal, 0),
             new VertexElementProperties(36, VertexElementFormat.Vector3, VertexElementUsage.Tangent, 0),
             new VertexElementProperties(48, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0),
         });
 }
Ejemplo n.º 9
0
 /// <summary>
 /// Initializes static members of the <see cref="PointSpriteVertexFormat"/> struct.
 /// </summary>
 static PointSpriteVertexFormat()
 {
     VertexFormat = new VertexBufferFormat(new VertexElementProperties[]
     {
         new VertexElementProperties(0, VertexElementFormat.Vector3, VertexElementUsage.Position, 0),
         new VertexElementProperties(12, VertexElementFormat.Color, VertexElementUsage.Color, 0),
         new VertexElementProperties(16, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 0),
         new VertexElementProperties(24, VertexElementFormat.Vector4, VertexElementUsage.TextureCoordinate, 1),
         new VertexElementProperties(40, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 2),
         new VertexElementProperties(48, VertexElementFormat.Vector2, VertexElementUsage.TextureCoordinate, 3),
     });
 }
Ejemplo n.º 10
0
        public int GetVertexSize(VertexBufferFormat type)
        {
            switch (type)
            {
            case VertexBufferFormat.AmbientPrt:
                return(0x4);

            case VertexBufferFormat.LinearPrt:
                return(0x4);

            case VertexBufferFormat.QuadraticPrt:
                return(0x24);

            case VertexBufferFormat.Decorator:
                return(0x20);

            case VertexBufferFormat.ParticleModel:
                return(0x20);

            case VertexBufferFormat.Rigid:
                return(0x38);

            case VertexBufferFormat.Skinned:
                return(0x40);

            case VertexBufferFormat.StaticPerPixel:
                return(0x8);

            case VertexBufferFormat.StaticPerVertex:
                return(0x14);

            case VertexBufferFormat.StaticPerVertexColor:
                return(0xC);

            case VertexBufferFormat.TinyPosition:
                return(0x10);

            case VertexBufferFormat.World:
            case VertexBufferFormat.World2:
                return(0x38);

            case VertexBufferFormat.Unknown1A:
                return(0xC);

            case VertexBufferFormat.Unknown1B:
                return(0x18);

            default:
                return(-1);
            }
        }
Ejemplo n.º 11
0
        public PatchGrid( Terrain terrain, int gridWidth, int gridHeight )
        {
            int highestRes = Patch.GetLevelResolution( Patch.HighestDetailLod );
            highestRes *= highestRes;

            VertexBufferFormat format = new VertexBufferFormat( );
            format.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );
            m_Vb = RbGraphics.Factory.CreateVertexBuffer( );
            m_Vb.Create( format, gridWidth * gridHeight * highestRes );

            m_Patches = new Patch[ gridWidth, gridHeight ];

            float z = -PatchDepth * ( gridHeight / 2 );
            float xInc = PatchWidth;
            float zInc = PatchDepth;

            float maxWidth = gridWidth * PatchWidth;
            float maxHeight = gridWidth * PatchDepth;

            terrain.SetTerrainArea( maxWidth, maxHeight );

            int vbOffset = 0;

            for ( int row = 0; row < gridHeight; ++row, z += zInc )
            {
                float x = -PatchWidth * ( gridWidth / 2 );
                for ( int col = 0; col < gridWidth; ++col, x += xInc )
                {
                    Color c = ( ( col + row ) % 2 ) == 0 ? Color.Black : Color.White;

                    m_Patches[ col, row ] = new Patch( terrain, vbOffset, x, z, PatchWidth, PatchDepth, c );
                    vbOffset += highestRes;
                }
            }

            int maxCol = gridWidth - 1;
            int maxRow = gridHeight - 1;
            for ( int row = 0; row < gridHeight; ++row )
            {
                for ( int col = 0; col < gridWidth; ++col )
                {
                    Patch left	= ( col == 0 ) ? null : ( m_Patches[ col - 1, row ] );
                    Patch right	= ( col == maxCol ) ? null : ( m_Patches[ col + 1, row ] );
                    Patch up	= ( row == 0 ) ? null : ( m_Patches[ col, row - 1] );
                    Patch down	= ( row == maxRow ) ? null : ( m_Patches[ col, row + 1 ] );

                    m_Patches[ col, row ].Link( left, right, up, down );
                }
            }
        }
        public QuadPatchVertices( )
        {
            VertexBufferFormat format = new VertexBufferFormat( );
            format.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );

            m_Vb = Graphics.Factory.CreateVertexBuffer( );
            m_Vb.Create( format, QuadPatch.PatchResolution * QuadPatch.PatchResolution * PoolSize );

            int vertexIndex = 0;
            for ( int i = 0; i < PoolSize; ++i )
            {
                m_FreeList.Add( vertexIndex );
                vertexIndex += QuadPatch.PatchResolution * QuadPatch.PatchResolution;
            }
        }
        /// <summary>
        /// Default constructor
        /// </summary>
        public TerrainPatchVertices( )
        {
            VertexBufferFormat format = new VertexBufferFormat( );
            format.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );
            format.Add( VertexFieldSemantic.Normal, VertexFieldElementTypeId.Float32, 3 );
            format.Add( VertexFieldSemantic.Texture0, VertexFieldElementTypeId.Float32, 2 );
            format.Add( VertexFieldSemantic.Texture1, VertexFieldElementTypeId.Float32, 2 );

            GraphicsLog.Info( "Creating terrain patch vertex pool using format {0}", format );

            m_Vb = Graphics.Factory.CreateVertexBuffer( );
            m_Vb.Create( format, TerrainPatchConstants.PatchTotalVertexCount * PoolSize );

            Clear( );
        }
 public void UnbindVertices()
 {
     VertexFormat = VertexBufferFormat.Invalid;
     RigidVertices = null;
     SkinnedVertices = null;
 }
        private void BuildBuffers( int maxParticles )
        {
            m_MaxParticles = maxParticles;
            m_Vb = Graphics.Factory.CreateVertexBuffer( );

            VertexBufferFormat vbFormat = new VertexBufferFormat( );
            vbFormat.Add( VertexFieldSemantic.Position, VertexFieldElementTypeId.Float32, 3 );
            vbFormat.Add( VertexFieldSemantic.Texture0, VertexFieldElementTypeId.Float32, 2 );
            vbFormat.Static = false;
            m_Vb.Create( vbFormat, maxParticles * 4 );

            m_Ib = Graphics.Factory.CreateIndexBuffer( );

            ushort[] indices = new ushort[ maxParticles * 6 ];
            int curIndex = 0;
            ushort indexValue = 0;
            for ( int particleCount = 0; particleCount < maxParticles; ++particleCount )
            {
                indices[ curIndex++ ] = indexValue;
                indices[ curIndex++ ] = ( ushort )( indexValue + 1 );
                indices[ curIndex++ ] = ( ushort )( indexValue + 3 );

                indices[ curIndex++ ] = ( ushort )( indexValue + 1 );
                indices[ curIndex++ ] = ( ushort )( indexValue + 2 );
                indices[ curIndex++ ] = ( ushort )( indexValue + 3 );

                indexValue += 4;
            }
            m_Ib.Create( indices, true );
        }
        /// <summary>
        /// Creates a geo sphere
        /// </summary>
        private IRenderable CreateGeoSphere( Units.Metres radius, int subdivisions )
        {
            m_GeometryRadius = radius;
            Vector3[] sideNormals = new Vector3[ 6 ]
                {
                    new Vector3( 1, 0, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),
                    new Vector3( -1, 0, 0 ), new Vector3( 0, -1, 0 ), new Vector3( 0, 0, -1 )
                };
            VertexBufferFormat format = new VertexBufferFormat( );
            format.Add<float>( VertexFieldSemantic.Position, 3 );
            format.Add<float>( VertexFieldSemantic.Normal, 3 );
            format.Add<float>( VertexFieldSemantic.Texture0, 2 );

            float renderRadius = radius.ToRenderUnits;
            float modelSideLength = 10.0f;
            float uvMul = 1.0f / subdivisions;

            VertexBufferBuilder vbBuilder = new VertexBufferBuilder( format );
            for ( int sideNormalIndex = 0; sideNormalIndex < sideNormals.Length; ++sideNormalIndex )
            {
                Vector3 sideNormal = sideNormals[ sideNormalIndex ];
                Vector3 xAxis = sideNormals[ ( sideNormalIndex + 1 ) % sideNormals.Length ];
                Vector3 yAxis = sideNormals[ ( sideNormalIndex + 2 ) % sideNormals.Length ];
                Vector3 xStride = xAxis * modelSideLength;
                Vector3 yStride = yAxis * modelSideLength;
                Vector3 xStep = xStride / subdivisions;
                Vector3 yStep = yStride / subdivisions;

                Point3 mid = Point3.Origin + sideNormal * modelSideLength / 2;

                Point3 topLeft = mid - ( xStride / 2 ) - ( yStride / 2 );
                Point3 sidePos = topLeft;
                for ( int y = 0; y < subdivisions; ++y )
                {
                    Point3 curPos = sidePos;
                    float v = y * uvMul;
                    float nV = ( y + 1 ) * uvMul;

                    for ( int x = 0; x < subdivisions; ++x )
                    {
                        Vector3 sphereNormal = curPos.ToVector3( ).MakeNormal( );
                        Vector3 sphereNxNormal = ( curPos + xStep ).ToVector3( ).MakeNormal( );
                        Vector3 sphereNyNormal = ( curPos + yStep ).ToVector3( ).MakeNormal( );
                        Vector3 sphereNxNyNormal = ( curPos + xStep + yStep ).ToVector3( ).MakeNormal( );

                        Point3 spherePos = ( sphereNormal * renderRadius ).ToPoint3( );
                        Point3 sphereNxPos = ( sphereNxNormal * renderRadius ).ToPoint3( );
                        Point3 sphereNyPos = ( sphereNyNormal * renderRadius ).ToPoint3( );
                        Point3 sphereNxNyPos = ( sphereNxNyNormal * renderRadius ).ToPoint3( );

                        float u = x * uvMul;
                        float nU = ( x + 1 ) * uvMul;

                        vbBuilder.Add( VertexFieldSemantic.Position, spherePos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, u, v );

                        vbBuilder.Add( VertexFieldSemantic.Position, sphereNxPos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNxNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, nU, v );

                        vbBuilder.Add( VertexFieldSemantic.Position, sphereNyPos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNyNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, u, nV );

                        vbBuilder.Add( VertexFieldSemantic.Position, sphereNxPos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNxNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, nU, v );

                        vbBuilder.Add( VertexFieldSemantic.Position, sphereNxNyPos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNxNyNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, nU, nV );

                        vbBuilder.Add( VertexFieldSemantic.Position, sphereNyPos );
                        vbBuilder.Add( VertexFieldSemantic.Normal, sphereNyNormal );
                        vbBuilder.Add( VertexFieldSemantic.Texture0, u, nV );

                        curPos += xStep;
                    }
                    sidePos += yStep;
                }
            }

            return new VertexBufferRenderer( vbBuilder.Build( ), PrimitiveType.TriList );
        }
Ejemplo n.º 17
0
        /// <summary>
        /// 修改Buffer
        /// </summary>
        /// <param name="chunkManager"></param>
        /// <param name="eventId"></param>
        /// <param name="fillWithNumIndex"></param>
        /// <param name="characterWidth">字符宽度</param>
        public static void Modify(ChunkManager chunkManager, int eventId, int fillWithNumIndex, float characterWidth = 8f)
        {
            Chunk_IASetVertexBuffers chunk = chunkManager.allChunks[eventId + chunkManager.CaptureBeginChunkIndex - 1] as Chunk_IASetVertexBuffers;

            if (chunk == null)
            {
                Console.WriteLine($"chunk {eventId} is not a valid Chunk_IASetVertexBuffers");
                return;
            }

            uint stride = chunk.pStrides[0];
            uint offset = chunk.pOffsets[0];

            Chunk_CreateBuffer createBuffer = chunk.parent as Chunk_CreateBuffer;

            if (createBuffer == null)
            {
                Console.WriteLine("chunk dos not has a valid CreateBuffer parent");
                return;
            }

            int dataOffset = createBuffer.pInitialData != null ? createBuffer.pInitialData.sysMemDataOffset : createBuffer.data.sysMemDataOffset;

            const int UID_PREFIX_COUNT = 5;                                    // 前5个文字为 <UID: >前缀

            uint perDrawLen    = createBuffer.Descriptor.ByteWidth / 5;        // 带阴影的文字会画5遍
            uint uidCount      = (perDrawLen / stride) / 6 - UID_PREFIX_COUNT; // uid采用每个文字使用6个顶点的方式
            uint uidDataOffset = UID_PREFIX_COUNT * 6 * stride + offset;

            // 找出指定字符使用的6个顶点的uv
            VertexBufferFormat[] fillVal = new VertexBufferFormat[6];
            fixed(void *pFill = &chunkManager.section.uncompressedData[dataOffset + uidDataOffset + fillWithNumIndex * 6 * stride])
            {
                VertexBufferFormat *pUidFill = (VertexBufferFormat *)pFill;

                for (int i = 0; i < 6; i++)
                {
                    fillVal[i].u = pUidFill->u;
                    fillVal[i].v = pUidFill->v;

                    pUidFill++;
                }
            }

            // 开始替换数据
            int perDrawUidDataOffset = (int)uidDataOffset;

            for (int i = 0; i < 5; i++) // 带阴影的文字会画5遍
            {
                fixed(void *pData = &chunkManager.section.uncompressedData[dataOffset + perDrawUidDataOffset])
                {
                    VertexBufferFormat *pDst = (VertexBufferFormat *)pData;

                    for (int j = 0; j < uidCount * 6; j++)
                    {
                        // 当前轮次都以第一个字符的位置为基准
                        if (j < 6)
                        {
                            fillVal[j].x = pDst->x;
                            fillVal[j].y = pDst->y;
                            fillVal[j].z = pDst->z;
                        }

                        pDst->x = fillVal[j % 6].x + (j / 6) * characterWidth;
                        pDst->y = fillVal[j % 6].y;
                        pDst->z = fillVal[j % 6].z;

                        pDst->u = fillVal[j % 6].u;
                        pDst->v = fillVal[j % 6].v;

                        pDst++;
                    }
                }

                perDrawUidDataOffset += (int)perDrawLen;
            }
        }
Ejemplo n.º 18
0
 public VertexBufferObject(VertexBufferFormat Format, float[] Data)
 {
     Format_   = Format;
     Data_     = Data;
     Vertices_ = Parse();
 }
 /// <summary>
 /// Setup constructor. Creates the underlying vertex buffer whose memory will be managed by this class
 /// </summary>
 public ManagedVertexBuffer( VertexBufferFormat format, int numVertices )
 {
     Create( format, numVertices );
 }