void FLandscapeComponentSceneProxyMobile::CreateRenderThreadResources() { // Use only Index buffers SharedBuffers = FLandscapeComponentSceneProxy::SharedBuffersMap.FindRef(SharedBuffersKey); if (SharedBuffers == nullptr) { SharedBuffers = new FLandscapeSharedBuffers( SharedBuffersKey, SubsectionSizeQuads, NumSubsections, GetScene().GetFeatureLevel(), false); FLandscapeComponentSceneProxy::SharedBuffersMap.Add(SharedBuffersKey, SharedBuffers); } SharedBuffers->AddRef(); int32 VertexBufferSize = PlatformData.Num(); // Copy platform data into vertex buffer VertexBuffer = new FLandscapeVertexBufferMobile(PlatformData.GetData(), VertexBufferSize); FLandscapeVertexFactoryMobile* LandscapeVertexFactory = new FLandscapeVertexFactoryMobile(); LandscapeVertexFactory->MobileData.PositionComponent = FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FLandscapeMobileVertex,Position), sizeof(FLandscapeMobileVertex), VET_UByte4N); for( uint32 Index = 0; Index < LANDSCAPE_MAX_ES_LOD_COMP; ++Index ) { LandscapeVertexFactory->MobileData.LODHeightsComponent.Add (FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FLandscapeMobileVertex,LODHeights) + sizeof(uint8) * 4 * Index, sizeof(FLandscapeMobileVertex), VET_UByte4N)); } LandscapeVertexFactory->InitResource(); VertexFactory = LandscapeVertexFactory; // Assign LandscapeUniformShaderParameters LandscapeUniformShaderParameters.InitResource(); PlatformData.Empty(); }
/** Initialization */ void Init(const FArrowVertexBuffer* VertexBuffer) { if (IsInRenderingThread()) { // Initialize the vertex factory's stream components. FDataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Position, VET_Float3); NewData.TextureCoordinates.Add( FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FDynamicMeshVertex, TextureCoordinate), sizeof(FDynamicMeshVertex), VET_Float2) ); NewData.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentX, VET_PackedNormal); NewData.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentZ, VET_PackedNormal); SetData(NewData); } else { ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( InitArrowVertexFactory, FArrowVertexFactory*, VertexFactory, this, const FArrowVertexBuffer*, VertexBuffer, VertexBuffer, { // Initialize the vertex factory's stream components. FDataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Position, VET_Float3); NewData.TextureCoordinates.Add( FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FDynamicMeshVertex, TextureCoordinate), sizeof(FDynamicMeshVertex), VET_Float2) ); NewData.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentX, VET_PackedNormal); NewData.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentZ, VET_PackedNormal); VertexFactory->SetData(NewData); }); }
void FSsPartsVertexFactory::Init(const FSsPartsVertexBuffer* VertexBuffer) { if(IsInRenderingThread()) { FLocalVertexFactory::DataType Data; Data.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, Position, VET_Float3); Data.TextureCoordinates.Add(FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FSsPartVertex,TexCoord), sizeof(FSsPartVertex), VET_Float2)); Data.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, Color, VET_Color); Data.TextureCoordinates.Add(FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FSsPartVertex,ColorBlend), sizeof(FSsPartVertex), VET_Float2)); Data.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, TangentX, VET_PackedNormal); Data.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, TangentZ, VET_PackedNormal); SetData(Data); } else { ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( FInitSsPartsVertexFactory, FSsPartsVertexFactory*, VertexFactory, this, const FSsPartsVertexBuffer*, VertexBuffer, VertexBuffer, { DataType Data; Data.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, Position, VET_Float3); Data.TextureCoordinates.Add(FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FSsPartVertex,TexCoord), sizeof(FSsPartVertex), VET_Float2)); Data.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, Color, VET_Color); Data.TextureCoordinates.Add(FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FSsPartVertex,ColorBlend), sizeof(FSsPartVertex), VET_Float2)); Data.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, TangentX, VET_PackedNormal); Data.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FSsPartVertex, TangentZ, VET_PackedNormal); VertexFactory->SetData(Data); }); }
void Init(const FBrickChunkVertexBuffer& VertexBuffer,uint32 FaceIndex) { // Initialize the vertex factory's stream components. DataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(&VertexBuffer, FBrickVertex, X, VET_UByte4N); NewData.TextureCoordinates.Add(STRUCTMEMBER_VERTEXSTREAMCOMPONENT(&VertexBuffer, FBrickVertex, X, VET_UByte4N)); NewData.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(&VertexBuffer, FBrickVertex, X, VET_UByte4N); // Use a stride of 0 to use the same TangentX/TangentZ for all faces using this vertex factory. NewData.TangentBasisComponents[0] = FVertexStreamComponent(&TangentBuffer,sizeof(FPackedNormal) * (2 * FaceIndex + 0),0,VET_PackedNormal); NewData.TangentBasisComponents[1] = FVertexStreamComponent(&TangentBuffer,sizeof(FPackedNormal) * (2 * FaceIndex + 1),0,VET_PackedNormal); check(!IsInRenderingThread()); ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( InitBrickChunkVertexFactory, FBrickChunkVertexFactory*,VertexFactory,this, DataType,NewData,NewData, { VertexFactory->SetData(NewData); });
/** Default constructor. */ FTileVertexFactory() { FLocalVertexFactory::DataType Data; // position Data.PositionComponent = FVertexStreamComponent( >ileRendererVertexBuffer,STRUCT_OFFSET(FMaterialTileVertex,Position),sizeof(FMaterialTileVertex),VET_Float3); // tangents Data.TangentBasisComponents[0] = FVertexStreamComponent( >ileRendererVertexBuffer,STRUCT_OFFSET(FMaterialTileVertex,TangentX),sizeof(FMaterialTileVertex),VET_PackedNormal); Data.TangentBasisComponents[1] = FVertexStreamComponent( >ileRendererVertexBuffer,STRUCT_OFFSET(FMaterialTileVertex,TangentZ),sizeof(FMaterialTileVertex),VET_PackedNormal); // color Data.ColorComponent = FVertexStreamComponent( >ileRendererVertexBuffer,STRUCT_OFFSET(FMaterialTileVertex,Color),sizeof(FMaterialTileVertex),VET_Color); // UVs Data.TextureCoordinates.Add(FVertexStreamComponent( >ileRendererVertexBuffer,STRUCT_OFFSET(FMaterialTileVertex,U),sizeof(FMaterialTileVertex),VET_Float2)); // update the data SetData(Data); }
/** Init function that should only be called on render thread. */ void Init_RenderThread(const FProcMeshVertexBuffer* VertexBuffer) { check(IsInRenderingThread()); // Initialize the vertex factory's stream components. DataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Position, VET_Float3); NewData.TextureCoordinates.Add( FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FDynamicMeshVertex, TextureCoordinate), sizeof(FDynamicMeshVertex), VET_Float2) ); NewData.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentX, VET_PackedNormal); NewData.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentZ, VET_PackedNormal); NewData.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Color, VET_Color); SetData(NewData); }
void FPaperSpriteVertexFactory::Init(const FPaperSpriteVertexBuffer* InVertexBuffer) { check(!IsInRenderingThread()); ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( InitPaperSpriteVertexFactory, FPaperSpriteVertexFactory*,VertexFactory,this, const FPaperSpriteVertexBuffer*,VB,InVertexBuffer, { // Initialize the vertex factory's stream components. DataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VB,FPaperSpriteVertex,Position,VET_Float3); NewData.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VB,FPaperSpriteVertex,TangentX,VET_PackedNormal); NewData.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VB,FPaperSpriteVertex,TangentZ,VET_PackedNormal); NewData.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VB,FPaperSpriteVertex,Color,VET_Color); NewData.TextureCoordinates.Add(FVertexStreamComponent(VB, STRUCT_OFFSET(FPaperSpriteVertex,TexCoords), sizeof(FPaperSpriteVertex), VET_Float2)); VertexFactory->SetData(NewData); });
/** Initialization */ void Init(const FTerrainMeshVertexBuffer* VertexBuffer) { // Commented out to enable building light of a level (but no backing is done for the procedural mesh itself) //check(!IsInRenderingThread()); ENQUEUE_UNIQUE_RENDER_COMMAND_TWOPARAMETER( InitTerrainMeshVertexFactory, FTerrainMeshVertexFactory*, VertexFactory, this, const FTerrainMeshVertexBuffer*, VertexBuffer, VertexBuffer, { // Initialize the vertex factory's stream components. DataType NewData; NewData.PositionComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Position, VET_Float3); NewData.TextureCoordinates.Add( FVertexStreamComponent(VertexBuffer, STRUCT_OFFSET(FDynamicMeshVertex, TextureCoordinate), sizeof(FDynamicMeshVertex), VET_Float2) ); NewData.TangentBasisComponents[0] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentX, VET_PackedNormal); NewData.TangentBasisComponents[1] = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, TangentZ, VET_PackedNormal); NewData.ColorComponent = STRUCTMEMBER_VERTEXSTREAMCOMPONENT(VertexBuffer, FDynamicMeshVertex, Color, VET_Color); VertexFactory->SetData(NewData); });
void FSplineMeshSceneProxy::InitResources(USplineMeshComponent* InComponent, int32 InLODIndex) { // Initialize the static mesh's vertex factory. ENQUEUE_UNIQUE_RENDER_COMMAND_THREEPARAMETER( InitSplineMeshVertexFactory, FSplineMeshVertexFactory*, VertexFactory, LODResources[InLODIndex].VertexFactory, const FStaticMeshLODResources*, RenderData, &InComponent->StaticMesh->RenderData->LODResources[InLODIndex], UStaticMesh*, Parent, InComponent->StaticMesh, { FLocalVertexFactory::DataType Data; Data.PositionComponent = FVertexStreamComponent( &RenderData->PositionVertexBuffer, STRUCT_OFFSET(FPositionVertex, Position), RenderData->PositionVertexBuffer.GetStride(), VET_Float3 ); Data.TangentBasisComponents[0] = FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(FStaticMeshFullVertex, TangentX), RenderData->VertexBuffer.GetStride(), VET_PackedNormal ); Data.TangentBasisComponents[1] = FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(FStaticMeshFullVertex, TangentZ), RenderData->VertexBuffer.GetStride(), VET_PackedNormal ); if (RenderData->ColorVertexBuffer.GetNumVertices() > 0) { Data.ColorComponent = FVertexStreamComponent( &RenderData->ColorVertexBuffer, 0, // Struct offset to color RenderData->ColorVertexBuffer.GetStride(), VET_Color ); } Data.TextureCoordinates.Empty(); if (!RenderData->VertexBuffer.GetUseFullPrecisionUVs()) { int32 UVIndex; for (UVIndex = 0; UVIndex < (int32)RenderData->VertexBuffer.GetNumTexCoords() - 1; UVIndex += 2) { Data.TextureCoordinates.Add(FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat16UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2DHalf) * UVIndex, RenderData->VertexBuffer.GetStride(), VET_Half4 )); } // possible last UV channel if we have an odd number if (UVIndex < (int32)RenderData->VertexBuffer.GetNumTexCoords()) { Data.TextureCoordinates.Add(FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat16UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2DHalf) * UVIndex, RenderData->VertexBuffer.GetStride(), VET_Half2 )); } if (Parent->LightMapCoordinateIndex >= 0 && (uint32)Parent->LightMapCoordinateIndex < RenderData->VertexBuffer.GetNumTexCoords()) { Data.LightMapCoordinateComponent = FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat16UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2DHalf) * Parent->LightMapCoordinateIndex, RenderData->VertexBuffer.GetStride(), VET_Half2 ); } } else { int32 UVIndex; for (UVIndex = 0; UVIndex < (int32)RenderData->VertexBuffer.GetNumTexCoords() - 1; UVIndex += 2) { Data.TextureCoordinates.Add(FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat32UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2D) * UVIndex, RenderData->VertexBuffer.GetStride(), VET_Float4 )); } // possible last UV channel if we have an odd number if (UVIndex < (int32)RenderData->VertexBuffer.GetNumTexCoords()) { Data.TextureCoordinates.Add(FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat32UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2D) * UVIndex, RenderData->VertexBuffer.GetStride(), VET_Float2 )); } if (Parent->LightMapCoordinateIndex >= 0 && (uint32)Parent->LightMapCoordinateIndex < RenderData->VertexBuffer.GetNumTexCoords()) { Data.LightMapCoordinateComponent = FVertexStreamComponent( &RenderData->VertexBuffer, STRUCT_OFFSET(TStaticMeshFullVertexFloat32UVs<MAX_STATIC_TEXCOORDS>, UVs) + sizeof(FVector2D) * Parent->LightMapCoordinateIndex, RenderData->VertexBuffer.GetStride(), VET_Float2 ); } } VertexFactory->SetData(Data); VertexFactory->InitResource(); });
void InitResource() override { FLocalVertexFactory* VertexFactory = this; const FProceduralMeshVertexBuffer* PooledVertexBuffer = VertexBuffer; ENQUEUE_RENDER_COMMAND(InitProceduralMeshVertexFactory)( [VertexFactory, PooledVertexBuffer](FRHICommandListImmediate& RHICmdList) { FDataType Data; Data.PositionComponent = FVertexStreamComponent( &PooledVertexBuffer->PositionBuffer, 0, sizeof(FVector), VET_Float3 ); Data.NumTexCoords = PooledVertexBuffer->GetNumTexCoords(); { Data.LightMapCoordinateIndex = PooledVertexBuffer->GetLightmapCoordinateIndex(); Data.TangentsSRV = PooledVertexBuffer->TangentBufferSRV; Data.TextureCoordinatesSRV = PooledVertexBuffer->TexCoordBufferSRV; Data.ColorComponentsSRV = PooledVertexBuffer->ColorBufferSRV; Data.PositionComponentSRV = PooledVertexBuffer->PositionBufferSRV; } { EVertexElementType UVDoubleWideVertexElementType = VET_None; EVertexElementType UVVertexElementType = VET_None; uint32 UVSizeInBytes = 0; if (PooledVertexBuffer->GetUse16bitTexCoords()) { UVSizeInBytes = sizeof(FVector2DHalf); UVDoubleWideVertexElementType = VET_Half4; UVVertexElementType = VET_Half2; } else { UVSizeInBytes = sizeof(FVector2D); UVDoubleWideVertexElementType = VET_Float4; UVVertexElementType = VET_Float2; } int32 UVIndex; uint32 UvStride = UVSizeInBytes * PooledVertexBuffer->GetNumTexCoords(); for (UVIndex = 0; UVIndex < (int32)PooledVertexBuffer->GetNumTexCoords() - 1; UVIndex += 2) { Data.TextureCoordinates.Add ( FVertexStreamComponent( &PooledVertexBuffer->TexCoordBuffer, UVSizeInBytes * UVIndex, UvStride, UVDoubleWideVertexElementType, EVertexStreamUsage::ManualFetch ) ); } // possible last UV channel if we have an odd number if (UVIndex < (int32)PooledVertexBuffer->GetNumTexCoords()) { Data.TextureCoordinates.Add(FVertexStreamComponent( &PooledVertexBuffer->TexCoordBuffer, UVSizeInBytes * UVIndex, UvStride, UVVertexElementType, EVertexStreamUsage::ManualFetch )); } Data.TangentBasisComponents[0] = FVertexStreamComponent(&PooledVertexBuffer->TangentBuffer, 0, 2 * sizeof(FPackedNormal), VET_PackedNormal, EVertexStreamUsage::ManualFetch); Data.TangentBasisComponents[1] = FVertexStreamComponent(&PooledVertexBuffer->TangentBuffer, sizeof(FPackedNormal), 2 * sizeof(FPackedNormal), VET_PackedNormal, EVertexStreamUsage::ManualFetch); Data.ColorComponent = FVertexStreamComponent(&PooledVertexBuffer->ColorBuffer, 0, sizeof(FColor), VET_Color, EVertexStreamUsage::ManualFetch); } VertexFactory->SetData(Data); }); if (IsInRenderingThread()) { FLocalVertexFactory::InitResource(); } }