Пример #1
0
 public VertexBufferBuilder(int positionsCount, VertexDescriptor vd)
 {
     this._vd          = vd;
     _taken            = new bool[positionsCount];
     _vertices         = new List <VertexCache> [positionsCount];
     _vertexBufferData = new MemoryStream(positionsCount * vd.Size);
 }
Пример #2
0
        public void Initialize()
        {
            var positions = new List <Vector3>();
            var indices   = new List <int>();

            _vd = VertexDescriptor.GetDescriptor <VertexP>(); // new VertexDescriptor(new VertexDeclaration(GGraphicDeviceFactory.Device, VertexP.Elements));

            _BuildGeoSphere(_subdivitions, 1, positions, indices);

            _vertices = new VertexP[positions.Count];
            for (int i = 0; i < positions.Count; i++)
            {
                _vertices[i] = new VertexP(positions[i]);
            }
            this._indices = new ushort[indices.Count];
            for (int i = 0; i < indices.Count; i++)
            {
                this._indices[i] = (ushort)indices[i];
            }

            if (_vb != null)
            {
                _vb.Dispose();
            }

            _vb = GraphicDeviceFactory.Device.CreateVertexBuffer(data: _vertices);

            if (_ib != null)
            {
                _ib.Dispose();
            }

            _ib = GraphicDeviceFactory.Device.CreateIndexBuffer(data: this._indices);
        }
Пример #3
0
        public Effect(
            GraphicsDevice graphicsDevice,
            string shaderName,
            VertexDescriptor vertexDescriptor)
        {
            _graphicsDevice = graphicsDevice;

            ID = _nextID++;

            using (var shaderStream = typeof(Effect).Assembly.GetManifestResourceStream($"OpenSage.Graphics.Shaders.{shaderName}.fxo"))
                using (var shaderReader = new BinaryReader(shaderStream))
                {
                    var vertexShaderBytecodeLength = shaderReader.ReadInt32();
                    var vertexShaderBytecode       = shaderReader.ReadBytes(vertexShaderBytecodeLength);
                    _vertexShader = AddDisposable(new Shader(graphicsDevice, shaderName + "VS", vertexShaderBytecode));

                    var pixelShaderBytecodeLength = shaderReader.ReadInt32();
                    var pixelShaderBytecode       = shaderReader.ReadBytes(pixelShaderBytecodeLength);
                    _pixelShader = AddDisposable(new Shader(graphicsDevice, shaderName + "PS", pixelShaderBytecode));
                }

            _cachedPipelineStates = new Dictionary <EffectPipelineStateHandle, PipelineState>();

            _vertexDescriptor = vertexDescriptor;

            _parameters = _vertexShader.ResourceBindings
                          .Concat(_pixelShader.ResourceBindings)
                          .Select(x => AddDisposable(new EffectParameter(graphicsDevice, x)))
                          .ToDictionary(x => x.Name);
        }
Пример #4
0
        public void SetVertexData <T>(ArraySegment <T> vertexData, VertexDescriptor descriptor, int destinationOffsetInVertices) where T : struct
        {
            Stride = descriptor.VertexSizeInBytes;
            int byteOffset = Unsafe.SizeOf <T>() * destinationOffsetInVertices;

            SetData(vertexData, byteOffset);
        }
Пример #5
0
        public void SetVertexData(IntPtr vertexData, VertexDescriptor descriptor, int numVertices)
        {
            Stride = descriptor.VertexSizeInBytes;
            int dataSizeInBytes = numVertices * descriptor.VertexSizeInBytes;

            SetData(vertexData, dataSizeInBytes);
        }
Пример #6
0
        public void VertexDescriptor_Constructor_PopulatesPropertries()
        {
            int vertex = 10;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex);

            Assert.Equal(vertex, vertexDescriptor.Vertex);
        }
Пример #7
0
        public void SetVertexData(IntPtr vertexData, VertexDescriptor descriptor, int numVertices, int destinationOffsetInVertices)
        {
            int dataSizeInBytes          = numVertices * descriptor.VertexSizeInBytes;
            int destinationOffsetInBytes = destinationOffsetInVertices * descriptor.VertexSizeInBytes;

            SetData(vertexData, dataSizeInBytes, destinationOffsetInBytes);
        }
Пример #8
0
        private unsafe void ComputeXZRadius(IntPtr vbStream, out Vector3 centerXz, out float radius, out Vector3 center, out int nbZeroDistance)
        {
            centerXz       = new Vector3();
            radius         = float.MinValue;
            nbZeroDistance = 0;
            int posOffset = VertexDescriptor.OffsetOf(IASemantic.Position, 0);
            int size      = VertexDescriptor.Size;

            byte *vbPter = (byte *)vbStream + posOffset;

            for (int i = 0; i < _vertexCount; i++)
            {
                centerXz += *(Vector3 *)(vbPter + size * i);
            }

            centerXz *= 1f / (float)_vertexCount;
            center    = centerXz;

            centerXz.Y = 0;

            for (int i = 0; i < _vertexCount; i++)
            {
                Vector3 point = *(Vector3 *)(vbPter + size * i);
                point.Y = 0;

                float distance = Vector3.Distance(point, centerXz);

                if (distance == 0 || distance.IsZero())
                {
                    nbZeroDistance++;
                }

                radius = Math.Max(radius, distance);
            }
        }
Пример #9
0
        private static VertexDescriptor CreateVertexDescriptor()
        {
            var vertexDescriptor = new VertexDescriptor();

            vertexDescriptor.SetAttributeDescriptor(InputClassification.PerVertexData, 0, "POSITION", 0, VertexFormat.Float3, 0, 0);
            vertexDescriptor.SetAttributeDescriptor(InputClassification.PerVertexData, 1, "NORMAL", 0, VertexFormat.Float3, 0, 12);
            vertexDescriptor.SetAttributeDescriptor(InputClassification.PerVertexData, 2, "TEXCOORD", 0, VertexFormat.Float2, 0, 24);
            vertexDescriptor.SetLayoutDescriptor(0, 32);
            return(vertexDescriptor);
        }
Пример #10
0
        public unsafe bool IsPlane(out Plane plane)
        {
            plane = new Plane();
            if (_faceCount != 2)
            {
                return(false);
            }

            var vbStream = _vb.Map(MapType.Read);
            var ibStream = _ib.Map(MapType.Read);

            Plane *planes = stackalloc Plane[2];

            try
            {
                int posOffset = VertexDescriptor.OffsetOf(IASemantic.Position, 0);
                int size      = VertexDescriptor.Size;

                byte *vbPter = (byte *)vbStream + posOffset;
                byte *ibPter = (byte *)ibStream;

                for (int iface = 0; iface < _faceCount; iface++)
                {
                    Vector3 p0;
                    Vector3 p1;
                    Vector3 p2;

                    if (_is16BitIndices)
                    {
                        p0 = *(Vector3 *)(vbPter + size * ((short *)ibPter)[iface * 3]);
                        p1 = *(Vector3 *)(vbPter + size * ((short *)ibPter)[iface * 3 + 1]);
                        p2 = *(Vector3 *)(vbPter + size * ((short *)ibPter)[iface * 3 + 2]);
                    }
                    else
                    {
                        p0 = *(Vector3 *)(vbPter + size * ((int *)ibPter)[iface * 3]);
                        p1 = *(Vector3 *)(vbPter + size * ((int *)ibPter)[iface * 3 + 1]);
                        p2 = *(Vector3 *)(vbPter + size * ((int *)ibPter)[iface * 3 + 2]);
                    }
                    planes[iface] = new Plane(p0, p1, p2);
                }
            }
            finally
            {
                _vb.Unmap();
                _ib.Unmap();
            }

            if (Plane.Equals(planes[0], planes[1]))
            {
                plane = planes[0];
                return(true);
            }
            return(false);
        }
Пример #11
0
        public void VertexDescriptor_AddEdge_FailsByAttemptToAddEdgeWithWrongVertices()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            int vertex3 = 30;

            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex3);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);
        }
Пример #12
0
        public unsafe bool IsCylindre(out float radius, out float height, out Vector3 center)
        {
            radius = 0;
            height = 0;
            center = new Vector3();

            if (_vertexCount == 0 || _faceCount <= 12)
            {
                return(false);
            }

            var vbStream = _vb.Map(MapType.Read);

            int posOffset = VertexDescriptor.OffsetOf(IASemantic.Position, 0);
            int size      = VertexDescriptor.Size;

            float distance;
            float maxY = float.MinValue;
            float minY = float.MaxValue;

            byte *vbPter = (byte *)vbStream + posOffset;

            Vector3 xzCenter;
            float   xzRadius;
            int     nb;

            ComputeXZRadius(vbStream, out xzCenter, out xzRadius, out center, out nb);
            xzCenter.Y = 0;

            bool result = true;

            for (int i = 0; i < _vertexCount; i++)
            {
                Vector3 point = *(Vector3 *)(vbPter + size * i);
                maxY = Math.Max(maxY, point.Y);
                minY = Math.Min(minY, point.Y);

                point.Y  = 0;
                distance = Vector3.Distance(point, xzCenter);

                if (!distance.IsEqual(xzRadius) && !distance.IsZero())
                {
                    result = false;
                    break;
                }
            }


            radius = xzRadius;
            height = maxY - minY;

            _vb.Unmap();
            return(result);
        }
Пример #13
0
        private void InitializeContextObjects(RenderContext context)
        {
            s_currentContext = context;
            ResourceFactory factory = context.ResourceFactory;

            s_vb0 = factory.CreateVertexBuffer(12 * s_cubeVertices.Length, false);
            VertexDescriptor desc = new VertexDescriptor(12, 1, 0, IntPtr.Zero);

            s_vb0.SetVertexData(s_cubeVertices.Select(vpc => vpc.Position).ToArray(), desc);

            s_vb1 = factory.CreateVertexBuffer(16 * s_cubeVertices.Length, false);
            VertexDescriptor desc2 = new VertexDescriptor(16, 1, 0, IntPtr.Zero);

            s_vb1.SetVertexData(s_cubeVertices.Select(vpc => vpc.Color).ToArray(), desc2);

            s_ib = factory.CreateIndexBuffer(sizeof(int) * s_cubeIndices.Length, false);
            s_ib.SetIndices(s_cubeIndices);

            MaterialVertexInput materialInputs0 = new MaterialVertexInput(
                12,
                new MaterialVertexInputElement[]
            {
                new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3),
            });

            MaterialVertexInput materialInputs1 = new MaterialVertexInput(
                16,
                new MaterialVertexInputElement[]
            {
                new MaterialVertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4)
            });

            MaterialInputs <MaterialGlobalInputElement> globalInputs = new MaterialInputs <MaterialGlobalInputElement>(
                new MaterialGlobalInputElement[]
            {
                new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix")
            });

            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>(
                new MaterialPerObjectInputElement[]
            {
                new MaterialPerObjectInputElement("ModelViewMatrixBuffer", MaterialInputType.Matrix4x4, _modelViewProvider.DataSizeInBytes)
            });

            s_material = factory.CreateMaterial(
                context,
                VertexShaderSource,
                FragmentShaderSource,
                materialInputs0,
                materialInputs1,
                globalInputs,
                perObjectInputs,
                MaterialTextureInputs.Empty);
        }
Пример #14
0
 public Effect GetEffect(string name, VertexDescriptor vertexDescriptor)
 {
     if (!_effects.TryGetValue(name, out var effect))
     {
         _effects[name] = effect = AddDisposable(new Effect(
                                                     _graphicsDevice,
                                                     name,
                                                     vertexDescriptor));
     }
     return(effect);
 }
Пример #15
0
        private void InitializeContextObjects(RenderContext context)
        {
            _currentContext = context;
            ResourceFactory factory = context.ResourceFactory;

            s_vb = factory.CreateVertexBuffer(VertexPositionNormalTexture.SizeInBytes * _vertices.Length, false);
            VertexDescriptor desc = new VertexDescriptor(VertexPositionNormalTexture.SizeInBytes, VertexPositionNormalTexture.ElementCount, 0, IntPtr.Zero);

            s_vb.SetVertexData(_vertices, desc);

            s_ib = factory.CreateIndexBuffer(sizeof(int) * _indices.Length, false);
            s_ib.SetIndices(_indices);

            MaterialVertexInput materialInputs = new MaterialVertexInput(
                VertexPositionNormalTexture.SizeInBytes,
                new MaterialVertexInputElement[]
            {
                new MaterialVertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3),
                new MaterialVertexInputElement("in_normal", VertexSemanticType.Normal, VertexElementFormat.Float3),
                new MaterialVertexInputElement("in_texCoord", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2)
            });

            MaterialInputs <MaterialGlobalInputElement> globalInputs = new MaterialInputs <MaterialGlobalInputElement>(
                new MaterialGlobalInputElement[]
            {
                new MaterialGlobalInputElement("ProjectionMatrixBuffer", MaterialInputType.Matrix4x4, "ProjectionMatrix"),
                new MaterialGlobalInputElement("ViewMatrixBuffer", MaterialInputType.Matrix4x4, "ViewMatrix"),
                new MaterialGlobalInputElement("LightBuffer", MaterialInputType.Custom, "LightBuffer"),
            });

            MaterialInputs <MaterialPerObjectInputElement> perObjectInputs = new MaterialInputs <MaterialPerObjectInputElement>(
                new MaterialPerObjectInputElement[]
            {
                new MaterialPerObjectInputElement("WorldMatrixBuffer", MaterialInputType.Matrix4x4, _worldProvider.DataSizeInBytes),
                new MaterialPerObjectInputElement("InverseTransposeWorldMatrixBuffer", MaterialInputType.Matrix4x4, _inverseTransposeWorldProvider.DataSizeInBytes),
            });

            MaterialTextureInputs textureInputs = new MaterialTextureInputs(
                new MaterialTextureInputElement[]
            {
                new TextureDataInputElement("surfaceTexture", _texture)
            });

            s_material = factory.CreateMaterial(
                context,
                VertexShaderSource,
                FragmentShaderSource,
                materialInputs,
                globalInputs,
                perObjectInputs,
                textureInputs);

            s_wireframeRasterizerState = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Wireframe, true, true);
        }
Пример #16
0
        public void VertexDescriptor_AddEdge_AddsDescriptorToEdges()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex1);

            Assert.AreEqual(0, vertexDescriptor.Edges.Count());
            EdgeDescriptor <int, string> edgeDesciptor = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);
            Assert.IsTrue(vertexDescriptor.Edges.Contains(edgeDesciptor));
        }
Пример #17
0
        public void VertexDescriptor_RemoveEdge_FailsByAttemptToAddEdgeWithWrongVertices()
        {
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(10);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(10, 20, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);
            Assert.AreEqual(1, vertexDescriptor.Edges.Count());

            EdgeDescriptor <int, string> unrelatedEdgeDesciptor = new EdgeDescriptor <int, string>(100, 200, "edge");

            vertexDescriptor.AddEdge(unrelatedEdgeDesciptor);
        }
Пример #18
0
        public void VertexDescriptor_RemoveEdge_NoExceptionIfListIsEmpty()
        {
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(10);

            Assert.Empty(vertexDescriptor.Edges);

            EdgeDescriptor <int, string> edgeDesciptor = new EdgeDescriptor <int, string>(20, 30, "edge");

            vertexDescriptor.RemoveEdge(edgeDesciptor);

            Assert.Empty(vertexDescriptor.Edges);
        }
Пример #19
0
        public void VertexDescriptor_AddEdge_FailsByAttemptToAddEdgeWithWrongVertices()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            int vertex3 = 30;

            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex3);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");
            var exception = Assert.Throws <InvalidOperationException>(() => vertexDescriptor.AddEdge(edgeDesciptor));

            Assert.Equal("Vertex '30' does not belong to the current edge that contains '10' and '20'", exception.Message);
        }
Пример #20
0
        public void VertexDescriptor_AddEdge_AddsDescriptorToEdges()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex1);

            Assert.Empty(vertexDescriptor.Edges);
            EdgeDescriptor <int, string> edgeDesciptor = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);
            Assert.Contains(edgeDesciptor, vertexDescriptor.Edges);
        }
Пример #21
0
        public void VertexDescriptor_RemoveEdge_FailsByAttemptToAddEdgeWithWrongVertices()
        {
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(10);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(10, 20, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);
            Assert.Single(vertexDescriptor.Edges);

            EdgeDescriptor <int, string> unrelatedEdgeDesciptor = new EdgeDescriptor <int, string>(100, 200, "edge");
            var exception = Assert.Throws <InvalidOperationException>(() => vertexDescriptor.AddEdge(unrelatedEdgeDesciptor));

            Assert.Equal("Vertex '10' does not belong to the current edge that contains '100' and '200'", exception.Message);
        }
Пример #22
0
        public static Mesh CreateMesh <TVert, TInd>(TVert[] vertices, TInd[] indices)
            where TVert : struct
            where TInd : struct
        {
            Mesh mesh = new Mesh(VertexDescriptor.GetDescriptor <TVert>());

            mesh.Layers            = new MeshPart[] { new MeshPart(0, indices.Length / 3, 0, vertices.Length, 0) };
            mesh.MaterialSlotNames = new string[] { "Material0" };
            mesh.CreateVertexBuffer(vertices);
            mesh.CreateIndexBuffer <TInd>(indices);
            mesh.ComputeBoundingVolumenes();
            return(mesh);
        }
Пример #23
0
        private void InitializeContextObjects(RenderContext context)
        {
            _currentContext = context;
            ResourceFactory factory = context.ResourceFactory;

            _vb = factory.CreateVertexBuffer(VertexPositionNormalTexture.SizeInBytes * _vertices.Length, false);
            VertexDescriptor desc = new VertexDescriptor(
                VertexPositionNormalTexture.SizeInBytes,
                VertexPositionNormalTexture.ElementCount,
                IntPtr.Zero);

            _vb.SetVertexData(_vertices, desc);

            _ib = factory.CreateIndexBuffer(sizeof(ushort) * _indices.Length, false);
            _ib.SetIndices(_indices);

            VertexInputDescription materialInputs = new VertexInputDescription(
                VertexPositionNormalTexture.SizeInBytes,
                new VertexInputElement[]
            {
                new VertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3),
                new VertexInputElement("in_normal", VertexSemanticType.Normal, VertexElementFormat.Float3),
                new VertexInputElement("in_texCoord", VertexSemanticType.TextureCoordinate, VertexElementFormat.Float2)
            });

            ShaderResourceDescription[] resources = new[]
            {
                new ShaderResourceDescription("ProjectionMatrixBuffer", ShaderConstantType.Matrix4x4),
                new ShaderResourceDescription("ViewMatrixBuffer", ShaderConstantType.Matrix4x4),
                new ShaderResourceDescription("LightBuffer", Unsafe.SizeOf <DirectionalLightBuffer>()),
                new ShaderResourceDescription("WorldMatrixBuffer", ShaderConstantType.Matrix4x4),
                new ShaderResourceDescription("InverseTransposeWorldMatrixBuffer", ShaderConstantType.Matrix4x4),
                new ShaderResourceDescription("surfaceTexture", ShaderResourceType.Texture),
                new ShaderResourceDescription("surfaceTexture", ShaderResourceType.Sampler)
            };
            _material = factory.CreateMaterial(
                context,
                VertexShaderSource,
                FragmentShaderSource,
                materialInputs,
                resources);

            _worldBuffer = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);
            _inverseTransposeWorldBuffer = factory.CreateConstantBuffer(ShaderConstantType.Matrix4x4);

            DeviceTexture2D texture = _texture.CreateDeviceTexture(factory);

            _textureBinding = factory.CreateShaderTextureBinding(texture);

            s_wireframeRasterizerState = factory.CreateRasterizerState(FaceCullingMode.None, TriangleFillMode.Wireframe, true, true);
        }
Пример #24
0
        public void VertexDescriptor_RemoveEdge_RemovesEdgeFromVertex()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex1);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);

            Assert.Contains(edgeDesciptor, vertexDescriptor.Edges);

            vertexDescriptor.RemoveEdge(edgeDesciptor);
            Assert.DoesNotContain(edgeDesciptor, vertexDescriptor.Edges);
        }
Пример #25
0
        public Mesh(VertexDescriptor vd)
        {
            if (vd == null)
            {
                throw new ArgumentNullException("vertex descriptor");
            }
            this._vd = vd;
            var noti = Service.Get <INotificationService>();

            if (noti != null)
            {
                noti.OnObjectCreated(this);
            }
        }
Пример #26
0
        public void VertexDescriptor_TryFindEdge_ReturnsFalseForWrongVertex()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex1);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);

            EdgeDescriptor <int, string> foundEdge;
            bool result = vertexDescriptor.TryFindEdge(vertex2, vertex1, out foundEdge);

            Assert.False(result);
            Assert.Equal(default(EdgeDescriptor <int, string>), foundEdge);
        }
Пример #27
0
        public void VertexDescriptor_TryFindEdge_ReturnsEdgeByVertex()
        {
            int vertex1 = 10;
            int vertex2 = 20;
            VertexDescriptor <int, string> vertexDescriptor = new VertexDescriptor <int, string>(vertex1);
            EdgeDescriptor <int, string>   edgeDesciptor    = new EdgeDescriptor <int, string>(vertex1, vertex2, "edge");

            vertexDescriptor.AddEdge(edgeDesciptor);

            EdgeDescriptor <int, string> foundEdge;
            bool result = vertexDescriptor.TryFindEdge(vertex1, vertex2, out foundEdge);

            Assert.True(result);
            Assert.Equal(foundEdge, edgeDesciptor);
        }
Пример #28
0
        public SceneImportResult LoadSkelletalMesh(string xFile)
        {
            this.xFile = xFile;
            var allocator = new MeshAllocator();
            AnimationController aController;
            FileStream          file = new FileStream(xFile, FileMode.Open, FileAccess.Read);
            GFrame frameRoot         = (GFrame)Frame.LoadHierarchyFromX(Engine.Graphics, file, MeshFlags.Managed, allocator, null, out aController);

            var vd = VertexDescriptor.Get <SkinVertex>();
            List <Tuple <Bone, GFrame> > bones = new List <Tuple <Bone, GFrame> >();

            Bone root = GetBone(frameRoot, bones);
            QuadTreeSceneNode sceneNode = new QuadTreeSceneNode(Path.GetFileNameWithoutExtension(xFile), 10);

            foreach (var item in bones)
            {
                if (item.Item2.MeshContainer != null)
                {
                    var mesh = GetMesh((GMeshContainer)item.Item2.MeshContainer, root, vd);
                    sceneNode.Add(new SkelletalMeshNode(item.Item2.Name, mesh));
                }
            }

            sceneNode.UpdateLayout(true);

            try
            {
                file.Close();
                if (aController != null)
                {
                    aController.Dispose();
                }
                allocator.DestroyFrame(frameRoot);
                root.Dispose();
            }
            catch (Exception)
            {
            }

            //AnimationCollection animations = new AnimationCollection();
            //animations.Load(xFile, model.RootBone);

            return(new SceneImportResult {
                VisualSceneRoot = sceneNode, BoneRoots = new List <Bone> {
                    root
                }
            });
        }
Пример #29
0
        public static Mesh CreateCapsule(float height, float radius, int capStacks, int capSlices, int trunkStacks, int trunkSlices)
        {
            CapsuleBuilder capsule = new CapsuleBuilder(height, radius, capStacks, capSlices, trunkStacks, trunkSlices);
            Mesh           mesh    = new Mesh(VertexDescriptor.GetDescriptor <MeshVertex>());

            mesh.Layers = new MeshPart[]
            {
                new MeshPart(capsule.Top.StartIndex, capsule.Top.PrimitiveCount, capsule.Top.StartVertex, capsule.Top.VertexCount),
                new MeshPart(capsule.Cylindre.StartIndex, capsule.Cylindre.PrimitiveCount, capsule.Cylindre.StartVertex, capsule.Cylindre.VertexCount),
                new MeshPart(capsule.Bottom.StartIndex, capsule.Bottom.PrimitiveCount, capsule.Bottom.StartVertex, capsule.Bottom.VertexCount)
            };
            mesh.MaterialSlotNames = new string[] { "Material0" };
            mesh.CreateVertexBuffer(capsule.Vertices);
            mesh.CreateIndexBuffer(capsule.Indices);
            return(mesh);
        }
        private void InitializeContextObjects(RenderContext context)
        {
            s_currentContext = context;
            ResourceFactory factory = context.ResourceFactory;

            s_vb0 = factory.CreateVertexBuffer(12 * s_cubeVertices.Length, false);
            VertexDescriptor desc = new VertexDescriptor(12, 1, IntPtr.Zero);

            s_vb0.SetVertexData(s_cubeVertices.Select(vpc => vpc.Position).ToArray(), desc);

            s_vb1 = factory.CreateVertexBuffer(16 * s_cubeVertices.Length, false);
            VertexDescriptor desc2 = new VertexDescriptor(16, 1, IntPtr.Zero);

            s_vb1.SetVertexData(s_cubeVertices.Select(vpc => vpc.Color).ToArray(), desc2);

            s_ib = factory.CreateIndexBuffer(s_cubeIndices, false);

            VertexInputDescription materialInputs0 = new VertexInputDescription(
                12,
                new VertexInputElement[]
            {
                new VertexInputElement("in_position", VertexSemanticType.Position, VertexElementFormat.Float3),
            });

            VertexInputDescription materialInputs1 = new VertexInputDescription(
                16,
                new VertexInputElement[]
            {
                new VertexInputElement("in_color", VertexSemanticType.Color, VertexElementFormat.Float4)
            });

            ShaderResourceDescription[] resources = new[]
            {
                new ShaderResourceDescription("ProjectionMatrixBuffer", ShaderConstantType.Matrix4x4),
                new ShaderResourceDescription("ModelViewMatrixBuffer", ShaderConstantType.Matrix4x4)
            };

            s_material = factory.CreateMaterial(
                context,
                VertexShaderSource,
                FragmentShaderSource,
                materialInputs0,
                materialInputs1,
                resources);
        }
Пример #31
0
        public void Constructor_BindsAttributeInfoForTwoFields_Ok()
        {
            // Arrange
            var gl = Substitute.For<IOpenGL30>();

            gl.WhenForAnyArgs(g => g.GenVertexArrays(Arg.Any<int>(), Arg.Any<uint[]>()))
                .Do(x => ((uint[])x[1])[0] = 1);

            var vertexBuffer = Substitute.For<IVertexBuffer>();
            var descriptor = new VertexDescriptor(typeof(TestVertexTwoFields), new[] { new VertexElement("Value", DataType.Float, 1, 0), new VertexElement("ValueInt", DataType.Int, 1, 4) });

            // Act
            var vertexArray = new VertexArray(gl, new[] { vertexBuffer }, new[] { descriptor });

            // Assert
            gl.Received().VertexAttribPointer(0, 1, (uint)DataType.Float, GLboolean.False, 8, IntPtr.Zero); // Stride should be size of vertex element.
            gl.Received().VertexAttribIPointer(1, 1, (uint)DataType.Int, 8, new IntPtr(4));
        }
Пример #32
0
 private MeshSection ReadMeshSection(Stream s)
 {
     MeshSection r = new MeshSection();
     r.Unknown01 = Helpers.ReadInt(s);
     r.Unknown02 = Helpers.ReadInt(s);
     r.SectionName = SerializeString(s);
     r.Unknown03 = Helpers.ReadInt(s);
     r.TriangleCount = Helpers.ReadInt(s);
     r.StartIndex = Helpers.ReadInt(s);
     r.VertexBufferOffset = Helpers.ReadInt(s);
     r.VertexCount = Helpers.ReadInt(s);
     r.Unknown04 = Helpers.ReadInt(s);
     r.Unknown05 = Helpers.ReadInt(s);
     r.Unknown06 = Helpers.ReadInt(s);
     r.VertexEntries = new List<VertexDescriptor>();
     for (int i = 0; i < 16; i++)
     {
         VertexDescriptor VertexEntry = new VertexDescriptor();
         VertexEntry.VertexType = Helpers.ReadShort(s);
         VertexEntry.Offset = s.ReadByte();
         VertexEntry.Unknown01 = s.ReadByte();
         if (VertexEntry.Offset != 0xFF)
             r.VertexEntries.Add(VertexEntry);
     }
     r.VertexStride = Helpers.ReadInt(s);
     r.Unknowns2 = new int[19];
     for (int i = 0; i < 19; i++)
         r.Unknowns2[i] = Helpers.ReadInt(s);
     r.SubBoneList = new ushort[0];
     return r;
 }