Beispiel #1
0
        public override void Start()
        {
            var mesh = new Graphics.Mesh();

            mesh.SetData(new Vertex[] {
                new Vertex(new Vector3(0.5f, 0.5f, 0), 1f, 0.2f, 0, 1f),
                new Vertex(new Vector3(-0.5f, 0.5f, 0), 1f, 0.2f, 0, 1f),
                new Vertex(new Vector3(-0.5f, -0.5f, 0), 1f, 0.5f, 0, 1f),
                new Vertex(new Vector3(-0.5f, 0.5f, 0), 1f, 0.5f, 0, 1f),
                new Vertex(new Vector3(0.5f, -0.5f, 0), 1f, 0.5f, 0, 1f),
                new Vertex(new Vector3(0.5f, 0.5f, 0), 1f, 0.5f, 0, 1f)
            });
            // Creates a new bullet that is deadly to all agents including the owner
            AddHandler <Events.FireBulletEvent>((e) =>
            {
                Entity bullet = Caboodle.Entities.Create();
                bullet.AddComponent <MeshRenderer>().mesh = mesh;
                Transform transform = bullet.AddComponent <Transform>();
                transform.SetAngles(e.start.GetAngles());
                transform.Position     = e.start.Position + e.start.Up * 10;
                Bullet bulletComponent = bullet.AddComponent <Bullet>();
                bulletComponent.dir    = e.start.Up;
                bulletComponent.owner  = e.owner;
            });
        }
Beispiel #2
0
        void createMeshes(Node node)
        {
            if (node.HasMeshes)
            {
                foreach (int meshIndex in node.MeshIndices)
                {
                    Assimp.Mesh amesh = myScene.Meshes[meshIndex];

                    //create the material
                    Graphics.Material mat = createMaterial(myScene.Materials[amesh.MaterialIndex]);

                    //create the geometry
                    Graphics.Mesh mesh = new Graphics.Mesh();
                    mesh.primativeType = OpenTK.Graphics.OpenGL.PrimitiveType.Triangles;
                    mesh.indexBase     = currIndexOffset;
                    mesh.indexCount    = amesh.FaceCount * 3;
                    mesh.material      = mat;

                    //get the indices
                    foreach (Face face in amesh.Faces)
                    {
                        for (int i = 0; i < 3; i++)
                        {
                            index.Add((UInt16)(face.Indices[i] + currVertOffset));
                            currIndexOffset++;
                        }
                    }

                    //get the verts
                    for (int i = 0; i < amesh.VertexCount; i++)
                    {
                        V3N3T2 v = new V3N3T2();
                        v.Position = toVector(amesh.Vertices[i]);

                        if (amesh.HasNormals == true)
                        {
                            v.Normal = toVector(amesh.Normals[i]);
                        }

                        if (amesh.HasTextureCoords(0) == true)
                        {
                            v.TexCoord = toVector2D(amesh.TextureCoordinateChannels[0][i]);
                        }

                        myVerts.Add(v);
                    }

                    currVertOffset += amesh.VertexCount;

                    myModel.myMeshes.Add(mesh);
                }
            }

            if (node.HasChildren)
            {
                foreach (Node child in node.Children)
                {
                    createMeshes(child);
                }
            }
        }
Beispiel #3
0
        public override IDisposable Load(Type resourceType, string identifier)
        {
            using (var assimpContext = new Assimp.AssimpContext())
            {
                var scene = assimpContext.ImportFile(identifier);
                var meshes = new List<Graphics.Mesh>();

                foreach (var mesh in scene.Meshes)
                {
                    var bytesPerVertex = 12;

                    if (mesh.HasNormals)
                    {
                        bytesPerVertex += 12;
                    }

                    if (mesh.HasTextureCoords(0))
                    {
                        bytesPerVertex += 8;
                    }

                    var vertexCount = mesh.VertexCount;
                    var meshSizeInBytes = vertexCount * bytesPerVertex;

                    using (var stream = new SlimDX.DataStream(meshSizeInBytes, true, true))
                    {
                        for (var i = 0; i < vertexCount; ++i)
                        {
                            stream.Write(mesh.Vertices[i]);

                            if (mesh.HasNormals)
                            {
                                stream.Write(mesh.Normals[i]);
                            }

                            if (mesh.HasTextureCoords(0))
                            {
                                stream.Write(mesh.TextureCoordinateChannels[0][i].X);
                                stream.Write(mesh.TextureCoordinateChannels[0][i].Y);
                            }
                        }

                        var vertexBuffer = new Graphics.VertexBuffer(device.Handle, stream, bytesPerVertex, vertexCount, SlimDX.Direct3D11.PrimitiveTopology.TriangleList);
                        var indices = mesh.GetIndices();

                        if (indices != null && indices.Count() > 0)
                        {
                            var indexBuffer = new Graphics.IndexBuffer(device.Handle, indices);

                            return new Graphics.Mesh(vertexBuffer, indexBuffer);
                        }

                        var result = new Graphics.Mesh(vertexBuffer);

                        if (resourceType.Equals(typeof(Graphics.Mesh)))
                        {
                            return result;
                        }
                        else
                        {
                            meshes.Add(result);
                        }
                    }
                }

                if (meshes.Count > 0)
                {
                    return new Graphics.MeshGroup(meshes);
                }
                else
                {
                    throw new KeyNotFoundException("Failed to load mesh: " + identifier);
                }
            }
        }
        /// <summary>
        ///		Loads this scene node from a given binary reader.
        /// </summary>
        /// <param name="reader">Binary reader to load this scene node from.</param>
        public override void Load(BinaryReader reader)
        {
            base.Load(reader);
            _event = reader.ReadString();

            int flagMask = reader.ReadInt32();
            _visible = (flagMask & 1) != 0;
            _enabled = (flagMask & 2) != 0;
            _solid = (flagMask & 4) != 0;

            if ((flagMask & 262144) != 0)
            {
                string meshUrl = reader.ReadString();
                if (ResourceManager.ResourceExists(meshUrl) == true)
                    _mesh = GraphicsManager.LoadMesh(meshUrl, 0);
            }

            if ((flagMask & 8) != 0)
            {
                string imageUrl = reader.ReadString();
                int cellWidth = reader.ReadInt32();
                int cellHeight = reader.ReadInt32();
                int hSpacing = reader.ReadInt16();
                int vSpacing = reader.ReadInt16();
                if (ResourceManager.ResourceExists(imageUrl) == true)
                    _image = GraphicsManager.LoadImage(imageUrl,cellWidth,cellHeight,hSpacing,vSpacing, 0);
            }
            if ((flagMask & 16) != 0)
            {
                string fontUrl = reader.ReadString();
                if (ResourceManager.ResourceExists(fontUrl) == true)
                    _bitmapFont = GraphicsManager.LoadFont(fontUrl);
            }
            if ((flagMask & 32) != 0) _text = reader.ReadString();
            if ((flagMask & 64) != 0)
            {
                _boundingRectangle.X = reader.ReadInt32();
                _boundingRectangle.Y = reader.ReadInt32();
            }
            if ((flagMask & 128) != 0)
            {
                _boundingRectangle.Width = reader.ReadInt32();
                _boundingRectangle.Height = reader.ReadInt32();
            }
            if ((flagMask & 256) != 0) _frame = reader.ReadInt32();

            if ((flagMask & 512) != 0)
                _renderMode = (EntityRenderMode)reader.ReadByte();
            else
                _renderMode = EntityRenderMode.Image;

            if ((flagMask & 1024) != 0)
                _blendMode = (BlendMode)reader.ReadByte();
            else
                _blendMode = BlendMode.Alpha;

            if ((flagMask & 2048) != 0)
                _color = reader.ReadInt32();
            else
                _color = unchecked((int)0xFFFFFFFF);

            if ((flagMask & 4096) != 0)
            {
                if (_collisionPolygon == null) InitializeCollision();
                int count = reader.ReadInt32();
                _collisionPolygon.Layers = new int[count];
                for (int i = 0; i < count; i++)
                    _collisionPolygon.Layers[i] = reader.ReadInt32();
            }
            if ((flagMask & 8192) != 0)
            {
                _collisionRectangle.X = reader.ReadInt32();
                _collisionRectangle.Y = reader.ReadInt32();
            }
            if ((flagMask & 16384) != 0)
            {
                _collisionRectangle.Width = reader.ReadInt32();
                _collisionRectangle.Height = reader.ReadInt32();
            }

            if ((flagMask & 32768) != 0)
                _depthLayer = reader.ReadInt32();

            if ((flagMask & 65536) != 0)
                _depthMode = (EntityDepthMode)reader.ReadByte();

            if ((flagMask & 131072) != 0)
                _shader = GraphicsManager.LoadShader(reader.ReadString());
        }
        /// <summary>
        ///     Resets this entity to the state it was in when it was created.
        /// </summary>
        public override void Reset()
        {
            base.Reset();

            if (_collisionPolygon != null) DeinitializeCollision();

            _forceVisibility = false;
            _forceBoundingBoxVisibility = false;
            _forceCollisionBoxVisibility = false;

            _visible  = true;
            _enabled = true;
            _solid = false;

            _event = "";
            _renderEventLines = false;
            _eventNodes.Clear();
            _eventLineColor = unchecked((int)0xFFFF0000);

            _image = null;
            _mesh = null;
            _frame = 0;
            _renderMode = EntityRenderMode.Rectangle;
            _boundingRectangle = new Rectangle(0, 0, 16, 16);
            _collisionRectangle = new Rectangle(0, 0, 16, 16);

            _color = unchecked((int)0xFFFFFFFF);
            _blendMode = BlendMode.Alpha;

            _text = "";
            _bitmapFont = null;

            _renderBoundingBox = false;
            _renderCollisionBox = false;
            _renderSizingPoints = false;
            _boundingBoxColor = unchecked((int)0xFF0000FF);
            _collisionBoxColor = unchecked((int)0xFF666666);
            _sizingPointsColor = unchecked((int)0xFFFFFFFF);
            _sizingPointsSize = 5;

            _collisionPolygon = null;

            _depthLayer = 0;
            _depthMode = EntityDepthMode.SubtractCollisionBoxBottom;

            _triggered = false;

            _shader = null;
        }