Example #1
0
        private void FormGame_Load(object sender, EventArgs e)
        {
            if (DesignMode)
            {
                return;
            }

            var resolver        = new GenericFileResolver("GameContent");
            var resourceManager = new ResourceManager(resolver);

            resourceManager.RegisterLoader(new Model3DLoader(), ".fbx");
            resourceManager.RegisterLoader(new Texture2DLoader(), ".png;.jpg;.bmp;.tga;.dds");

            model = resourceManager.Load <Model3DResource>("material_sample.fbx");

            floor = resourceManager.Load <Model3DResource>("floor.fbx");

            texture[0]      = resourceManager.Load <Texture2DResource>("DefaultMaterial_Base_Color.png");
            normalmap[0]    = resourceManager.Load <Texture2DResource>("DefaultMaterial_Normal_DirectX.png");
            metallicmap[0]  = resourceManager.Load <Texture2DResource>("DefaultMaterial_Metallic.png");
            roughnessmap[0] = resourceManager.Load <Texture2DResource>("DefaultMaterial_Roughness.png");

            texture[1]      = resourceManager.Load <Texture2DResource>("t1_c.png");
            normalmap[1]    = resourceManager.Load <Texture2DResource>("t1_n.png");
            metallicmap[1]  = resourceManager.Load <Texture2DResource>("t1_m.png");
            roughnessmap[1] = resourceManager.Load <Texture2DResource>("t1_r.png");

            texture[2]      = resourceManager.Load <Texture2DResource>("t2_c.png");
            normalmap[2]    = resourceManager.Load <Texture2DResource>("t2_n.png");
            metallicmap[2]  = resourceManager.Load <Texture2DResource>("t2_m.png");
            roughnessmap[2] = resourceManager.Load <Texture2DResource>("t2_r.png");

            texture[3]      = resourceManager.Load <Texture2DResource>("floor_c.png");
            normalmap[3]    = resourceManager.Load <Texture2DResource>("floor_n.png");
            metallicmap[3]  = resourceManager.Load <Texture2DResource>("floor_m.png");
            roughnessmap[3] = resourceManager.Load <Texture2DResource>("floor_r.png");

            cubemap = resourceManager.Load <Texture2DResource>("yoko.dds");

            control = new ControlViewport()
            {
                Dock = DockStyle.Fill
            };
            control.CustomRender += ControlOnCustomRender;
            Controls.Add(control);

            control.MouseMove += ControlOnMouseMove;
            control.KeyDown   += ControlOnKeyDown;
            control.KeyUp     += ControlOnKeyUp;

            gameLoopWatch      = Stopwatch.StartNew();
            gameTimer          = new Timer();
            gameTimer.Interval = 15;
            gameTimer.Tick    += GameTimerOnTick;
            gameTimer.Start();

            camera.Position = Vector3.ForwardLH * 10f;
        }
Example #2
0
        public void DrawModel3D(Model3DResource model, DrawInfo info)
        {
            if (model.VertexBuffer == null)
            {
                var vertices = new List <Vertex>();
                for (int i = 0; i < model.ModelData.Meshes[0].VertexCount; i++)
                {
                    var position = model.ModelData.Meshes[0].Vertices[i];
                    var normal   = model.ModelData.Meshes[0].Normals[i];
                    var uv       = model.ModelData.Meshes[0].TextureCoordinateChannels[0][i];
                    var tangent  = model.ModelData.Meshes[0].Tangents[i];
                    var binormal = model.ModelData.Meshes[0].BiTangents[i];

                    var v = new Vertex(new Vector3(-position.X, position.Z, position.Y),
                                       new Vector3(-normal.X, normal.Z, normal.Y), new Vector2(uv.X, 1f - uv.Y),
                                       new Vector3(-tangent.X, tangent.Z, tangent.Y), new Vector3(-binormal.X, binormal.Z, binormal.Y));

                    vertices.Add(v);
                }

                var indices = model.ModelData.Meshes[0].GetIndices();

                model.VertexBuffer = Buffer.Create(Device, BindFlags.VertexBuffer, vertices.ToArray());
                model.IndexBuffer  = Buffer.Create(Device, BindFlags.IndexBuffer, indices);
                model.VertexCount  = vertices.Count;
                model.IndexCount   = indices.Length;
            }

            Context.InputAssembler.InputLayout       = layout;
            Context.InputAssembler.PrimitiveTopology = PrimitiveTopology.TriangleList;
            Context.InputAssembler.SetVertexBuffers(0, new[] { model.VertexBuffer }, new[] { Vertex.Stride }, new[] { 0 });
            Context.InputAssembler.SetIndexBuffer(model.IndexBuffer, Format.R32_UInt, 0);
            shader.GetVariableByName("world").AsMatrix().SetMatrix(info.World);
            shader.GetVariableByName("viewProj").AsMatrix().SetMatrix(info.View * info.Projection);
            shader.GetVariableByName("diffuse").AsShaderResource().SetResource(info.DiffuseMap.View);
            shader.GetVariableByName("normal").AsShaderResource().SetResource(info.NormalMap.View);
            shader.GetVariableByName("metallic").AsShaderResource().SetResource(info.MetallicMap.View);
            shader.GetVariableByName("roughness").AsShaderResource().SetResource(info.RoughnessMap.View);
            shader.GetVariableByName("campos").AsVector().Set(info.CameraPosition);
            shader.GetVariableByName("cubemap").AsShaderResource().SetResource(info.CubeMap.View);

            var lights = new Light[10];

            lights[0].Type      = 1;
            lights[0].Direction = new Vector3((float)Math.Sin(DateTime.Now.Millisecond / 1000f * Math.PI * 2.0) * 5f, 10, 10);
            lights[0].Position  = Vector3.Zero;
            lights[0].Color     = Vector3.One;

            var lih   = GCHandle.Alloc(lights, GCHandleType.Pinned);
            var liptr = lih.AddrOfPinnedObject();

            shader.GetVariableByName("lights").GetElement(0).GetMemberByName("pos").AsVector().Set(lights[0].Position);
            shader.GetVariableByName("lights").GetElement(0).GetMemberByName("dir").AsVector().Set(new Vector3(Control.MousePosition.X - 960, 180, Control.MousePosition.Y - 540) / 2000f);
            shader.GetVariableByName("lights").GetElement(0).GetMemberByName("col").AsVector().Set(lights[0].Color);
            shader.GetVariableByName("lights").GetElement(0).GetMemberByName("type").AsScalar().Set(lights[0].Type);
            //shader.GetVariableByName("lights").SetRawValue(liptr,0,Marshal.SizeOf(typeof(Light))*10);

            lih.Free();

            shader.GetTechniqueByIndex(0).GetPassByIndex(0).Apply(Context);

            Context.DrawIndexed(model.IndexCount, 0, 0);
        }