Example #1
0
        //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];
            }
        }
Example #2
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());
        }