예제 #1
0
        private void AddSponzaAtriumObjects()
        {
            ObjParser parser = new ObjParser();

            using (FileStream objStream = File.OpenRead(AssetHelper.GetPath("Models/SponzaAtrium/sponza.obj")))
            {
                ObjFile atriumFile = parser.Parse(objStream);
                MtlFile atriumMtls;
                using (FileStream mtlStream = File.OpenRead(AssetHelper.GetPath("Models/SponzaAtrium/sponza.mtl")))
                {
                    atriumMtls = new MtlParser().Parse(mtlStream);
                }

                foreach (ObjFile.MeshGroup group in atriumFile.MeshGroups)
                {
                    Vector3                scale               = new Vector3(0.1f);
                    ConstructedMeshInfo    mesh                = atriumFile.GetMesh(group);
                    MaterialDefinition     materialDef         = atriumMtls.Definitions[mesh.MaterialName];
                    ImageSharpTexture      overrideTextureData = null;
                    ImageSharpTexture      alphaTexture        = null;
                    MaterialPropsAndBuffer materialProps       = CommonMaterials.Brick;
                    if (materialDef.DiffuseTexture != null)
                    {
                        string texturePath = AssetHelper.GetPath("Models/SponzaAtrium/" + materialDef.DiffuseTexture);
                        overrideTextureData = LoadTexture(texturePath, true);
                    }
                    if (materialDef.AlphaMap != null)
                    {
                        string texturePath = AssetHelper.GetPath("Models/SponzaAtrium/" + materialDef.AlphaMap);
                        alphaTexture = LoadTexture(texturePath, false);
                    }
                    if (materialDef.Name.Contains("vase"))
                    {
                        materialProps = CommonMaterials.Vase;
                    }
                    if (group.Name == "sponza_117")
                    {
                        MirrorMesh.Plane = Plane.CreateFromVertices(
                            atriumFile.Positions[group.Faces[0].Vertex0.PositionIndex] * scale.X,
                            atriumFile.Positions[group.Faces[0].Vertex1.PositionIndex] * scale.Y,
                            atriumFile.Positions[group.Faces[0].Vertex2.PositionIndex] * scale.Z);
                        materialProps = CommonMaterials.Reflective;
                    }

                    AddTexturedMesh(
                        mesh,
                        overrideTextureData,
                        alphaTexture,
                        materialProps,
                        Vector3.Zero,
                        Quaternion.Identity,
                        scale,
                        group.Name);
                }
            }
        }
예제 #2
0
        private static ConstructedMeshInfo LoadTeapotMesh()
        {
            if (_teapotMesh == null)
            {
                string path = Path.Combine(AppContext.BaseDirectory, "Assets", "Models", "Teapot.obj");
                using (var fs = File.OpenRead(path))
                {
                    _teapotMesh = new ObjParser().Parse(fs).GetFirstMesh();
                }
            }

            return(_teapotMesh);
        }
예제 #3
0
            public PreviewScene(RenderContext rc, ConstructedMeshInfo previewItem)
            {
                _rc = rc;
                ResourceFactory factory = rc.ResourceFactory;

                _fb = factory.CreateFramebuffer(Width, Height);

                _projection = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                UpdateProjectionData();
                _view = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _view.SetData(Matrix4x4.CreateLookAt(Vector3.UnitZ * 7f + Vector3.UnitY * 1.5f, Vector3.Zero, Vector3.UnitY));

                _lightProjection = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _lightProjection.SetData(Matrix4x4.CreateOrthographicOffCenter(-18, 18, -18, 18, -10, 60f));

                _lightView = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
                _lightView.SetData(Matrix4x4.CreateLookAt(-_lightDirection * 20f, Vector3.Zero, Vector3.UnitY));

                _lightInfo = factory.CreateConstantBuffer(ShaderConstantType.Float4);
                _lightInfo.SetData(new Vector4(_lightDirection, 1));

                _standardPipelineStage = new StandardPipelineStage(rc, "Standard", _fb);
                _shadowMapStage        = new ShadowMapStage(rc, "ShadowMap_Preview");
                _stages = new PipelineStage[]
                {
                    _shadowMapStage,
                    _standardPipelineStage,
                };

                SceneBuffers.Add("ProjectionMatrix", _projection);
                SceneBuffers.Add("ViewMatrix", _view);
                SceneBuffers.Add("LightProjMatrix", _lightProjection);
                SceneBuffers.Add("LightViewMatrix", _lightView);
                SceneBuffers.Add("LightInfo", _lightInfo);

                _floor = CreatePreviewModel(PlaneModel.Vertices, PlaneModel.Indices);
                _floor.WorldMatrix.Data = Matrix4x4.CreateScale(10f, 1f, 10f);

                _previewItem = CreatePreviewModel(previewItem.Vertices, previewItem.Indices);
                _previewItem.WorldMatrix.Data = Matrix4x4.CreateTranslation(0, 1.5f, 0);

                _visiblityManager = new FlatListVisibilityManager();
                _visiblityManager.AddRenderItem(_floor);
                _visiblityManager.AddRenderItem(_previewItem);
            }
예제 #4
0
        private void AddSponzaAtriumObjects(CommandList cl)
        {
            ObjParser parser = new ObjParser();

            using (FileStream objStream = File.OpenRead(AssetHelper.GetPath("Models/SponzaAtrium/sponza.obj")))
            {
                ObjFile atriumFile = parser.Parse(objStream);
                MtlFile atriumMtls;
                using (FileStream mtlStream = File.OpenRead(AssetHelper.GetPath("Models/SponzaAtrium/sponza.mtl")))
                {
                    atriumMtls = new MtlParser().Parse(mtlStream);
                }

                foreach (ObjFile.MeshGroup group in atriumFile.MeshGroups)
                {
                    ConstructedMeshInfo    mesh                = atriumFile.GetMesh(group);
                    MaterialDefinition     materialDef         = atriumMtls.Definitions[mesh.MaterialName];
                    ImageSharpTexture      overrideTextureData = null;
                    ImageSharpTexture      alphaTexture        = null;
                    MaterialPropsAndBuffer materialProps       = CommonMaterials.Brick;
                    if (materialDef.DiffuseTexture != null)
                    {
                        string texturePath = AssetHelper.GetPath("Models/SponzaAtrium/" + materialDef.DiffuseTexture);
                        overrideTextureData = LoadTexture(texturePath, true);
                    }
                    if (materialDef.AlphaMap != null)
                    {
                        string texturePath = AssetHelper.GetPath("Models/SponzaAtrium/" + materialDef.AlphaMap);
                        alphaTexture = LoadTexture(texturePath, false);
                    }
                    if (materialDef.Name.Contains("vase"))
                    {
                        materialProps = CommonMaterials.Vase;
                    }

                    AddTexturedMesh(cl, mesh, overrideTextureData, alphaTexture, materialProps, Vector3.Zero, Quaternion.Identity, new Vector3(0.1f));
                }
            }
        }