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( ); }
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) }); }
/// <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), }); }
/// <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), }); }
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); } }
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 ); }
/// <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; } }
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 ); }