//TODO: Refactor renderFlag preEffectsInstancingFlag and instancingFlag into an class/struct public ModelRuntimeDescriptor(Model <T, RealtimeMaterial> modelIn, string vShaderName, string fShaderName, VertexRuntimeTypes vertexRuntimeType, PrimitiveTopology primitiveTopology, RenderDescription renderDescription, InstancingRenderDescription instancingRenderDescription) { if (!Verifier.VerifyVertexStruct <T>(vertexRuntimeType)) { throw new ArgumentException($"Type Mismatch ModelRuntimeDescriptor"); } Model = modelIn; Length = modelIn.MeshCount; TotalInstanceCount = 1; _vertexShaderName = vShaderName; _fragmentShaderName = fShaderName; VertexRuntimeType = vertexRuntimeType; PrimitiveTopology = primitiveTopology; RenderDescription = renderDescription; PreEffectsFlag = RenderFlags.PRE_EFFECTS_MASK & renderDescription.RenderModeFlag; PreEffectsInstancingFlag = instancingRenderDescription.PreEffectsFlag; InstancingDataFlag = instancingRenderDescription.RenderModeFlag; var preEffectsInstancing = RenderFlags.GetAllPreEffectFor(PreEffectsInstancingFlag); VertexBufferList = new List <DeviceBuffer>(); IndexBufferList = new List <DeviceBuffer>(); Pipelines = new Pipeline[RenderFlags.EFFCTS_TOTAL_COUNT]; InstanceBufferLists = new List <DeviceBuffer> [RenderFlags.EFFCTS_TOTAL_COUNT]; InstanceBufferLists[RenderFlags.NORMAL_ARRAY_INDEX] = new List <DeviceBuffer>(); foreach (var preEffect in preEffectsInstancing) { InstanceBufferLists[RenderFlags.GetArrayIndexForFlag(preEffect)] = new List <DeviceBuffer>(); } InstanceBuffers = new DeviceBuffer[RenderFlags.EFFCTS_TOTAL_COUNT][]; TextureResourceSetsList = new List <ResourceSet>(); VertexInstanceLayoutGenerationList = new EventHandlerList(); VertexPreEffectsInstanceLayoutGenerationList = new EventHandlerList(); VertexPreEffectShaders = new Shader[RenderFlags.PRE_EFFCTS_TOTAL_COUNT]; GeometryPreEffectShaders = new Shader[RenderFlags.PRE_EFFCTS_TOTAL_COUNT]; FragmentPreEffectShaders = new Shader[RenderFlags.PRE_EFFCTS_TOTAL_COUNT]; // Reserve first spot for base vertex geometry //TODO: Make on list VertexLayouts = new VertexLayoutDescription[InstancingDataFlags.GetSizeOfPreEffectFlag(InstancingDataFlag) + 1]; VertexPreEffectsLayouts = new VertexLayoutDescription[RenderFlags.GetSizeOfPreEffectFlag(PreEffectsInstancingFlag) + 1]; EffectResourceSets = new ResourceSet[RenderFlags.EFFCTS_TOTAL_COUNT][]; for (int i = 0; i < RenderFlags.EFFCTS_TOTAL_COUNT; i++) { EffectResourceSets[i] = new ResourceSet[0]; } }
public ResourceLayout[] FillEffectsResourceSet(DisposeCollectorResourceFactory factory, SceneRuntimeDescriptor sceneRuntimeDescriptor, List <SubRenderable> childrenPre) { var effectLayoutList = new List <ResourceLayout>(); //TODO: just iterate over children and process them as Subrenderable !! if (ShadowMapEnabled) { var effectCount = RenderFlags.GetSizeOfPreEffectFlag(PreEffectsFlag) * 2; // 1 for Vertex Stage 1 for Fragment EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX] = new ResourceSet[effectCount]; var shadowMapRenderable = childrenPre[0] as ShadowMap; var shadowMapResourceLayout = ResourceGenerator.GenerateTextureResourceLayoutForShadowMapping(factory); effectLayoutList.Add(sceneRuntimeDescriptor.LightProvViewResourceLayout); effectLayoutList.Add(shadowMapResourceLayout); EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX][RenderFlags.GetPreEffectArrayIndexForFlag(RenderFlags.SHADOW_MAP)] = sceneRuntimeDescriptor.LightProjViewResourceSet; EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX][RenderFlags.GetPreEffectArrayIndexForFlag(RenderFlags.SHADOW_MAP) + 1] = ResourceGenerator.GenerateResourceSetForShadowMapping(shadowMapResourceLayout, shadowMapRenderable.ShadowMapTexView, factory); } if (OmniShadowMapEnabled) { var effectCount = 2; EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX] = new ResourceSet[effectCount]; EffectResourceSets[RenderFlags.OMNI_SHADOW_MAPS] = new ResourceSet[2]; //var omniShadowMapRenderable = childrenPre[RenderFlags.GetPreEffectArrayIndexForFlag(RenderFlags.OMNI_SHADOW_MAPS)] as OmniShadowMap; var omniShadowMapRenderable = childrenPre[0] as OmniShadowMap; var shadowMapResourceLayout = ResourceGenerator.GenerateTextureResourceLayoutForOmniShadowMapping(factory); //TODO: this has to be an array effectLayoutList.Add(sceneRuntimeDescriptor.CameraInfoResourceLayout); effectLayoutList.Add(shadowMapResourceLayout); EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX][0] = sceneRuntimeDescriptor.CameraInfoResourceSet; EffectResourceSets[RenderFlags.NORMAL_ARRAY_INDEX][1] = ResourceGenerator.GenerateResourceSetForShadowMapping(shadowMapResourceLayout, omniShadowMapRenderable.ShadowMapTexView, factory); EffectResourceSets[RenderFlags.OMNI_SHADOW_MAPS][0] = omniShadowMapRenderable.ShadowMatrices; EffectResourceSets[RenderFlags.OMNI_SHADOW_MAPS][1] = omniShadowMapRenderable.CameraInfo; } return(effectLayoutList.ToArray()); }