public virtual int DeInitializeComponent(int entityID, ECSComponent component)
        {
            if (component.GetType() == typeof(CTransform))
            {
                CTransform cTransform = component as CTransform;
                GameObject.Destroy(cTransform.GameObject);
            }

            if (component.GetType() == typeof(CSpriteRenderer))
            {
                CSpriteRenderer cRenderer = component as CSpriteRenderer;
                DestroyUnityComponent <SpriteRenderer>(entityID, cRenderer);
            }

            if (component.GetType() == typeof(CBoxCollider))
            {
                CBoxCollider cBoxCollider = component as CBoxCollider;
                OnColliderRemoved(entityID, cBoxCollider.BoxCollider);
                DestroyUnityComponent <BoxCollider>(entityID, cBoxCollider);
            }

            if (component.GetType() == typeof(CMeshCollider))
            {
                CMeshCollider cMeshCollider = component as CMeshCollider;
                OnColliderRemoved(entityID, cMeshCollider.Collider);
                DestroyUnityComponent <MeshCollider>(entityID, cMeshCollider);
            }

            if (component.GetType() == typeof(CSphereCollider))
            {
                CSphereCollider cSphereCollider = component as CSphereCollider;
                OnColliderRemoved(entityID, cSphereCollider.Collider);
                DestroyUnityComponent <SphereCollider>(entityID, cSphereCollider);
            }


            if (component.GetType() == typeof(CRigidbody))
            {
                CRigidbody cRigidbody = component as CRigidbody;
                DestroyUnityComponent <Rigidbody>(entityID, cRigidbody);
            }


            if (component.GetType() == typeof(CMeshRenderer))
            {
                CMeshRenderer cMeshRenderer = component as CMeshRenderer;
                DestroyUnityComponent <MeshRenderer>(entityID, cMeshRenderer);
                DestroyUnityComponent <MeshFilter>(entityID, cMeshRenderer);
            }


            return(0);
        }
        public void MultiQubitApplicationTest()
        {
            Qubit         control = new Qubit(ComplexExt.OneOverRootTwo, ComplexExt.OneOverRootTwo);
            Qubit         target  = new Qubit(1, 0);
            IQuantumState bell    = new CTransform(Gates.Not).Transform(new MultiQubit(control, target));
            IQuantumState res     = new PartialTransform(4, Gates.H, new[] { 0 }).Transform(bell);

            res.GetAmplitude("00".ToBits()).ShouldBe(new Complex(1.0 / 2, 0));
            res.GetAmplitude("11".ToBits()).ShouldBe(-new Complex(1.0 / 2, 0));
            res.GetAmplitude("01".ToBits()).ShouldBe(new Complex(1.0 / 2, 0));
            res.GetAmplitude("10".ToBits()).ShouldBe(new Complex(1.0 / 2, 0));
        }
Beispiel #3
0
        //--------------------------------------
        // NON-PUBLIC METHODS
        //--------------------------------------

        /// <summary>Creates a new ball in the scene with the given position and velocity.</summary>
        /// <param name="p">The ball position, in world-space.</param>
        /// <param name="v">The initial velocity to give to the ball.</param>
        /// <param name="r">The ball radius.</param>
        /// <param name="reflective">Whether to use an environment mapped material.</param>
        private int CreateBall(Vector3 p, Vector3 v, float r = 1.0f, bool reflective = false)
        {
            var ball = AddEntity();

            AddComponent(ball, new CBody {
                Aabb     = new BoundingBox(-r * Vector3.One, r * Vector3.One),
                Radius   = r,
                LinDrag  = 0.1f,
                Velocity = v
            });

            CTransform transf;

            AddComponent(ball, transf = new CTransform {
                Position = p,
                Rotation = Matrix.Identity,
                Scale    = r * Vector3.One
            });

            EnvMapMaterial envMap = null;

            if (reflective)
            {
                var rot = 0.0f;
                envMap = new EnvMapMaterial(mRenderer,
                                            ball,
                                            (CTransform)GetComponentFromEntity <CTransform>(ball),
                                            Game1.Inst.Content.Load <Texture2D>("Textures/Bumpmap0"));

                // TODO: If the camera moves, this needs to be done every frame.
                //envMap.SetCameraPos(new Vector3(9.0f, 12.0f, 18.0f));
                AddComponent(ball, new CLogic {
                    Fn = (t, dt) => {
                        rot            += 1.0f * dt;
                        transf.Rotation = Matrix.CreateRotationX(rot)
                                          * Matrix.CreateRotationY(0.7f * rot);

                        envMap.Update();
                    },
                    InvHz = 1.0f / 30.0f
                });
            }

            AddComponent <C3DRenderable>(ball, new CImportedModel {
                materials = new Dictionary <int, MaterialShader> {
                    { 0, reflective ? envMap : null }
                },
                model = Game1.Inst.Content.Load <Model>("Models/DummySphere")
            });

            return(ball);
        }
Beispiel #4
0
        public override void Update(float t, float dt)
        {
            foreach (var camera in Game1.Inst.Scene.GetComponents <CCamera>())
            {
                CCamera    cameraComponent    = (CCamera)camera.Value;
                CTransform transformComponent = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(camera.Key);

                Vector3 cameraPosition = transformComponent.Position;

                cameraComponent.View = Matrix.CreateLookAt(cameraPosition, cameraComponent.Target, Vector3.Up);
            }
            base.Update(t, dt);
        }
Beispiel #5
0
    public void OnStart()
    {
        //base.OnStart();
        currAliveTimer = MMath.GetRandomLimitedFloat(_monsterMinActiveTime, _monsterMaxActiveTime);
        currDeadTimer  = MMath.GetRandomLimitedFloat(_monsterMinRestTime, _monsterMaxRestTime);

        chilloutFace  = GameObject.GetGameObjectByName("maxChill");
        faceRender    = chilloutFace.RequireComponent <CSkinMeshRenderer>();
        faceTransform = chilloutFace.RequireComponent <CTransform>();
        faceRender.setEnabled(false);

        distortScript = GetScript <DistortForTime>(gameObject);
    }
Beispiel #6
0
 private void ComponentPreProcessing(string archetype, Bag <ECSComponent> components)
 {
     foreach (ECSComponent component in components)
     {
         if (component.GetType() == typeof(CTransform))
         {
             CTransform cTransform = (component as CTransform);
             if (cTransform.Name == null)
             {
                 cTransform.Name = archetype;
             }
         }
     }
 }
Beispiel #7
0
        public override void Handle(float t, float dt)
        {
            var npcTransform = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(entityId);
            var npcBody      = (CBody)Game1.Inst.Scene.GetComponentFromEntity <CBody>(entityId);
            var aiComponent  = (CAI)Game1.Inst.Scene.GetComponentFromEntity <CAI>(entityId);
            var flock        = (CFlock)Game1.Inst.Scene.GetComponentFromEntity <CFlock>(aiComponent.Flock);

            var rotationSpeed = Math.Min(1.8f * dt, 1);
            var movementSpeed = dt * flock.PreferredMovementSpeed * 5;

            var        closestEnemyDistance  = float.MaxValue;
            var        closestEnemyId        = -1;
            CTransform closestEnemyTransform = null;

            foreach (var player in Game1.Inst.Scene.GetComponents <CInput>())
            {
                if (!Game1.Inst.Scene.EntityHasComponent <CBody>(player.Key))
                {
                    continue;
                }
                var playerTransform = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(player.Key);

                var   positionDiff = playerTransform.Position - npcTransform.Position;
                float distance     = (float)Math.Sqrt(Math.Pow(positionDiff.X, 2) + 0 + Math.Pow(positionDiff.Z, 2));

                if (closestEnemyDistance > distance)
                {
                    closestEnemyDistance  = distance;
                    closestEnemyId        = player.Key;
                    closestEnemyTransform = playerTransform;
                }
            }
            if (closestEnemyId == -1)
            {
                return;
            }
            Vector3 dest      = Vector3.Normalize(closestEnemyTransform.Position - npcTransform.Position);
            var     source    = Vector3.Backward;
            var     goalQuat  = PositionalUtil.GetRotation(source, dest, Vector3.Up);
            var     startQuat = npcTransform.Rotation.Rotation;
            var     dQuat     = Quaternion.Lerp(startQuat, goalQuat, rotationSpeed);

            dQuat.X = 0;
            dQuat.Z = 0;
            npcTransform.Rotation = Matrix.CreateFromQuaternion(dQuat);

            // move forward in set direction
            npcBody.Velocity.X = (movementSpeed * npcTransform.Rotation.Forward).X;
            npcBody.Velocity.Z = (movementSpeed * npcTransform.Rotation.Forward).Z;
        }
Beispiel #8
0
        // Note: X is correct axis, but Y in this case actually is Z in game world (Y is for height)
        public float HeightPosition(float x, float y)
        {
            foreach (var renderable in Game1.Inst.Scene.GetComponents <C3DRenderable>())
            {
                if (renderable.Value.GetType() != typeof(CHeightmap))
                {
                    continue;
                }
                var heightmap = (CHeightmap)renderable.Value;
                var key       = renderable.Key;

                CTransform transform = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(key);

                x -= transform.Position.X;
                y -= transform.Position.Z;

                if (x < 0 || x > heightmap.Image.Width || y < 0 || y > heightmap.Image.Height)
                {
                    return(0);
                }
                // get four closest vertices
                int lowX  = (int)Math.Floor(x);
                int highX = (int)Math.Floor(x + 1);
                int lowY  = (int)Math.Floor(y);
                int highY = (int)Math.Floor(y + 1);

                var A = mHeightData[lowX, lowY];
                var B = mHeightData[highX, lowY];
                var C = mHeightData[lowX, highY];
                var D = mHeightData[highX, highY];

                // lerp func
                Func <float, float, float, float> f = (a, b, sigma) => (1.0f - sigma) * a + sigma * b;

                // fractional parts
                var fX = x - lowX;
                var fY = y - lowY;

                // 2d-interpolate over the square
                var h = f(f(A, B, fX), f(C, D, fX), fY);

                // P = (x, y)
                // f(a,b,x) = xa + (1-x)b
                // Pz = f(f(A,B,Px), f(C, D, Px), Py

                return(h * transform.Scale.Y);
            }
            return(0);
        }
        //--------------------------------------
        // NON-PUBLIC METHODS
        //--------------------------------------

        /// <summary>Creates a new ball in the scene with the given position and velocity.</summary>
        /// <param name="p">The ball position, in world-space.</param>
        /// <param name="v">The initial velocity to give to the ball.</param>
        /// <param name="r">The ball radius.</param>
        /// <param name="reflective">Whether to use an environment mapped material.</param>
        private int CreateBall(Vector3 p, Vector3 v, float r = 1.0f, bool reflective = false)
        {
            var ball = AddEntity();

            AddComponent(ball, new CBody {
                Aabb     = new BoundingBox(-r * Vector3.One, r * Vector3.One),
                Radius   = r,
                LinDrag  = 0.1f,
                Position = p,
                Velocity = v
            });
            CTransform transf;

            AddComponent(ball, transf = new CTransform {
                Position = p,
                Rotation = Matrix.Identity,
                Scale    = r * Vector3.One
            });


            if (reflective)
            {
                var rot = 0.0f;
                AddComponent(ball, new CInput());

                envMap = new EnvMapMaterial(mRenderer,
                                            ball,
                                            (CTransform)GetComponentFromEntity <CTransform>(ball),
                                            mSkybox);

                AddComponent(ball, new CLogic {
                    Fn = (t, dt) => {
                        rot            += 1.0f * dt;
                        transf.Rotation = Matrix.CreateRotationX(rot)
                                          * Matrix.CreateRotationY(0.7f * rot);
                        envMap.Update();
                    },
                    InvHz = 1.0f / 30.0f
                });
            }

            AddComponent <C3DRenderable>(ball, new CImportedModel {
                material = reflective ? envMap : null,
                model    = Game1.Inst.Content.Load <Model>("Models/DummySphere")
            });

            return(ball);
        }
        private CTransform VerifyTransform(ECSComponent component, int entityID)
        {
            CTransform cTransform = GetComponent <CTransform>(component, entityID);

            if (cTransform == null)
            {
                return(null);
            }

            if (cTransform.GameObject == null)
            {
                OnComponentInitializeFailure(component, "GameObject does not exist!");
                return(null);
            }

            return(cTransform);
        }
Beispiel #11
0
    public void OnStart()
    {
        trans_   = gameObject.RequireComponent <CTransform>();
        item_    = 0;
        itemPos_ = new List <Vector2>();

        // Quit
        itemPos_.Insert(0, new Vector2(0.047f, -0.075f));
        // Credits
        itemPos_.Insert(0, new Vector2(0.04f, -0.048f));
        // Options
        itemPos_.Insert(0, new Vector2(0.04f, -0.025f));
        // How To Play
        itemPos_.Insert(0, new Vector2(0.057f, 0.0f));
        // Start
        itemPos_.Insert(0, new Vector2(0.03f, 0.025f));
    }
Beispiel #12
0
    public void OnStart()
    {
        trans_   = gameObject.RequireComponent <CTransform>();
        item_    = 0;
        itemPos_ = new List <Vector2>();

        // Quit
        itemPos_.Insert(0, new Vector2(0.14f, -0.045f));
        // Main Menu
        itemPos_.Insert(0, new Vector2(0.14f, -0.012f));
        // Options
        itemPos_.Insert(0, new Vector2(0.14f, 0.022f));
        // How To Play
        itemPos_.Insert(0, new Vector2(0.14f, 0.032f));
        // Resume
        itemPos_.Insert(0, new Vector2(0.16f, 0.042f));
    }
Beispiel #13
0
        private void CalculateHeightData(CHeightmap compHeight, int key)
        {
            CTransform transformComponent = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(key);

            int terrainWidth  = compHeight.Image.Width;
            int terrainHeight = compHeight.Image.Height;

            var colorMap = new Color[terrainWidth * terrainHeight];

            compHeight.Image.GetData(colorMap);

            compHeight.HeightData = new Color[terrainWidth, terrainHeight];
            mHeightData           = new float[terrainWidth, terrainHeight];

            for (int x = 0; x < terrainWidth; x++)
            {
                for (int y = 0; y < terrainHeight; y++)
                {
                    compHeight.HeightData[x, y] = colorMap[x + y * terrainWidth];
                    mHeightData[x, y]           = colorMap[x + y * terrainWidth].R + transformComponent.Position.Y;
                    if (compHeight.elements.ContainsKey(colorMap[x + y * terrainWidth].B))
                    {
                        var s = 0.05f;
                        compHeight.EnvironmentSpawn.Add(new Vector4(s * x, mHeightData[x, y], s * y, colorMap[x + y * terrainWidth].B));
                    }
                }
            }

            float minHeight = float.MaxValue;
            float maxHeight = float.MinValue;

            for (int x = 0; x < terrainWidth; x++)
            {
                for (int y = 0; y < terrainHeight; y++)
                {
                    if (compHeight.HeightData[x, y].R < minHeight)
                    {
                        compHeight.LowestPoint = compHeight.HeightData[x, y].R;
                    }
                    if (compHeight.HeightData[x, y].R > maxHeight)
                    {
                        compHeight.HeighestPoint = compHeight.HeightData[x, y].R;
                    }
                }
            }
        }
Beispiel #14
0
        private void SetupBasicEffect(BasicEffect effect,
                                      CCamera camera,
                                      C3DRenderable model,
                                      Scene scene,
                                      CTransform transform,
                                      ModelMesh mesh,
                                      Matrix anim,
                                      Matrix boneTransform,
                                      LightingConfig config)
        {
            // TODO: we want the same lighting everywhere so no cheating with this ;) (other shaders dont have this)
            effect.EnableDefaultLighting();

            effect.PreferPerPixelLighting = true;
            effect.VertexColorEnabled     = model.enableVertexColor;
            effect.LightingEnabled        = true;
            effect.AmbientLightColor      = config.AmbientColor;

            effect.DirectionalLight0.Enabled       = true;
            effect.DirectionalLight0.Direction     = config.Direction;
            effect.DirectionalLight0.DiffuseColor  = config.DiffuseColor;
            effect.DirectionalLight0.SpecularColor = config.SpecularColor * model.specular;

            effect.DirectionalLight1.Enabled       = true;
            effect.DirectionalLight1.DiffuseColor  = config.DiffuseColor * 0.7f;
            effect.DirectionalLight1.SpecularColor = config.SpecularColor * model.specular;

            effect.DirectionalLight2.Enabled       = true;
            effect.DirectionalLight2.DiffuseColor  = config.DiffuseColor * 0.5f;
            effect.DirectionalLight2.SpecularColor = config.SpecularColor * model.specular;

            effect.SpecularPower = 100;

            effect.FogEnabled = config.FogEnabled;
            effect.FogStart   = config.FogStart;
            effect.FogEnd     = config.FogEnd;
            effect.FogColor   = config.ClearColor;

            effect.Projection = camera.Projection;
            effect.View       = camera.View;
            effect.World      = boneTransform * anim * transform.Frame;
        }
        private int DestroyUnityComponent <T>(int entityID, ECSComponent component) where T : Component
        {
            CTransform cTransform = VerifyTransform(component, entityID);

            if (cTransform == null)
            {
                OnComponentDeInitializeFailure(component, "Transform not found.");
                return(1);
            }

            T unityComponent = cTransform.GameObject.GetComponent <T>();

            if (component == null)
            {
                OnComponentDeInitializeFailure(component, "Unity component not found on transform " + typeof(T));
                return(1);
            }

            GameObject.Destroy(unityComponent);
            return(0);
        }
Beispiel #16
0
        public static IComponent[] Create(float x, float y, float size)
        {
            CPosition  position  = new CPosition(x, y);
            CDimension dimension = new CDimension(size, size);
            CTransform transform = new CTransform()
            {
                Rotation       = (float)Random.Range(0, System.Math.PI * 2),
                RotationOffset = new Vector2(size / 2, size / 2),
            };

            return(new IComponent[]
            {
                position,
                dimension,
                transform,
                new CColor(palette[Random.Range(0, palette.Length - 1)]),
                new CQuad(),
                new CPhysicsBody(Random.RandomVector2(Random.Range(0, 300)), new Vector2(0, 75)),
                new CPartitionable()
            });
        }
        /// <summary>Sets up the camera.</summary>
        /// <param name="fovDeg">The camera field of view, in degrees.</param>
        /// <param name="zNear">The Z-near clip plane, in meters from the camera.</param>
        /// <param name="zFar">The Z-far clip plane, in meters from the camera..</param>
        private int InitCam(float fovDeg = 60.0f, float zNear = 0.01f, float zFar = 1000.0f)
        {
            var aspect = Game1.Inst.GraphicsDevice.Viewport.AspectRatio;
            var cam    = AddEntity();
            var fovRad = fovDeg * 2.0f * MathHelper.Pi / 360.0f;
            var proj   = Matrix.CreatePerspectiveFieldOfView(fovRad, aspect, zNear, zFar);

            AddComponent(cam, new CCamera {
                ClipProjection = proj,
                Projection     = proj,
                Heading        = (float)-Math.Atan2(21f, -9f),
                Height         = -12,
                Distance       = 21
            });

            AddComponent(cam, camera = new CTransform {
                Position = new Vector3(9.0f, 12.0f, 21f),
                Rotation = Matrix.Identity,
                Scale    = Vector3.One
            });
            AddComponent(cam, new CInput());
            return(cam);
        }
Beispiel #18
0
 public static void WriteEntityLight(this NetBuffer message, int id, CBody cbody, CTransform cTransform)
 {
     message.Write(id);
     message.Write(cbody.Velocity);
     message.Write(cTransform.Position);
     message.WriteMatrix(cTransform.Rotation);
 }
Beispiel #19
0
        public override void UpdateEntity(int entity)
        {
            CBoid        boid        = (CBoid)boids[entity];
            CPosition    position    = (CPosition)positions[entity];
            CDimension   dimension   = (CDimension)dimensions[entity];
            CTransform   transform   = (CTransform)transforms[entity];
            CPhysicsBody physicsBody = (CPhysicsBody)physicsBodies[entity];

            Vector2 myCenter = new Vector2(position.X + dimension.Width / 2, position.Y + dimension.Height / 2);

            Vector2 cumulativeSeperation = Vector2.Zero;
            int     totalSeperation      = 0;

            Vector2 cumulativeAlignment = Vector2.Zero;
            int     totalAlignment      = 0;

            Vector2 cumulativeCohesion = Vector2.Zero;
            int     totalCohesion      = 0;

            float        distance;
            CPosition    theirPosition;
            CDimension   theirDimension;
            CPhysicsBody theirPhysicsBody;
            Vector2      force;
            Vector2      theirCenter;

            List <int> queryResult = binPartitioner.Query(new Morro.Core.Rectangle(position.X - boid.ViewRadius, position.Y - boid.ViewRadius, dimension.Width + boid.ViewRadius * 2, dimension.Height + boid.ViewRadius * 2));

            for (int i = 0; i < queryResult.Count; i++)
            {
                if (queryResult[i] == entity)
                {
                    continue;
                }

                theirPosition    = (CPosition)positions[queryResult[i]];
                theirDimension   = (CDimension)dimensions[queryResult[i]];
                theirPhysicsBody = (CPhysicsBody)physicsBodies[queryResult[i]];

                theirCenter = new Vector2(theirPosition.X + theirDimension.Width / 2, theirPosition.Y + theirDimension.Height / 2);

                distance = Vector2.Distance(myCenter, theirCenter);

                if (distance > 0)
                {
                    if (distance < boid.ViewRadius)
                    {
                        cumulativeCohesion += theirCenter;
                        totalCohesion++;

                        cumulativeAlignment += theirPhysicsBody.Velocity;
                        totalAlignment++;
                    }

                    if (distance < theirDimension.Width * 2)
                    {
                        force  = myCenter - theirCenter;
                        force /= distance * distance;
                        cumulativeSeperation += force;
                        totalSeperation++;
                    }

                    if (distance < 64 && theirDimension.Width > 2)
                    {
                        force  = myCenter - theirCenter;
                        force /= distance * distance;
                        cumulativeSeperation += force * 4;
                        totalSeperation++;
                    }
                }
            }

            distance = Vector2.Distance(Morro.Input.Mouse.SceneLocation, myCenter);

            if (distance > 0 && distance < 32)
            {
                force  = myCenter - Morro.Input.Mouse.SceneLocation;
                force /= distance * distance;
                cumulativeSeperation += force;
                totalSeperation++;
            }

            Vector2 seperation = CalculateSeperation();
            Vector2 alignment  = CalculateAlignment();
            Vector2 cohesion   = CalculateCohesion();

            Vector2 totalForce = seperation + alignment + cohesion;

            physicsBody.Velocity += totalForce;
            transform.Rotation    = -(float)Math.Atan2(physicsBody.Velocity.Y, physicsBody.Velocity.X);

            Vector2 CalculateSeperation()
            {
                if (totalSeperation <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeSeperation /= totalSeperation;
                cumulativeSeperation.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeSeperation - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * seperationIntensity);
            }

            Vector2 CalculateAlignment()
            {
                if (totalAlignment <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeAlignment /= totalAlignment;
                cumulativeAlignment.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeAlignment - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * alignmentIntensity);
            }

            Vector2 CalculateCohesion()
            {
                if (totalCohesion <= 0)
                {
                    return(Vector2.Zero);
                }

                cumulativeCohesion /= totalCohesion;
                cumulativeCohesion -= myCenter;
                cumulativeCohesion.SetMagnitude(boid.MoveSpeed);
                Vector2 result = cumulativeCohesion - physicsBody.Velocity;

                result.Limit(boid.MaxForce);

                return(result * cohesionIntensity);
            }
        }
Beispiel #20
0
        /// <summary> Message loop to check type of message and handle it accordingly </summary>
        public void MessageLoop()
        {
            while ((_msg = _peer.ReadMessage()) != null)
            {
                s_bpsBytes += _msg.LengthBytes;
                switch (_msg.MessageType)
                {
                case NetIncomingMessageType.DiscoveryRequest:
                    //Debug.WriteLine("ReceivePeersData DiscoveryRequest");
                    _peer.SendDiscoveryResponse(null, _msg.SenderEndPoint);
                    break;

                case NetIncomingMessageType.DiscoveryResponse:
                    // just connect to first server discovered
                    //Debug.WriteLine("ReceivePeersData DiscoveryResponse CONNECT");
                    if (_peer.Connections.Any(x => x.RemoteEndPoint.Address.Equals(_msg.SenderEndPoint.Address)))
                    {
                        Debug.WriteLine("allreadyConnected");
                    }
                    else
                    {
                        _peer.Connect(_msg.SenderEndPoint);
                    }
                    break;

                case NetIncomingMessageType.ConnectionApproval:
                    //Debug.WriteLine("ReceivePeersData ConnectionApproval");
                    _msg.SenderConnection.Approve();
                    //broadcast this to all connected clients
                    SendPeerInfo(_msg.SenderEndPoint.Address, _msg.SenderEndPoint.Port);
                    break;

                case NetIncomingMessageType.Data:
                    //another client sent us data
                    //Read TypeData First
                    Enums.MessageType mType = (Enums.MessageType)_msg.ReadByte();

                    if (mType == Enums.MessageType.String)
                    {
                        var metadata = _msg.ReadString();
                        if (metadata == "StartEvent")
                        {
                            var map = _msg.ReadString();
                            _isMaster           = false;
                            MasterNetConnection = _peer.Connections.FirstOrDefault(x => x.RemoteEndPoint.Address.ToString() == _msg.SenderEndPoint.Address.ToString());
                            Game1.Inst.Scene.Raise("startgame", map);
                        }
                        else if (metadata == "metadata")
                        {
                            Game1.Inst.Scene.Raise("network_data_text", _msg.ReadString());
                        }
                    }
                    else if (mType == Enums.MessageType.PeerInformation)
                    {
                        int       byteLenth    = _msg.ReadInt32();
                        byte[]    addressBytes = _msg.ReadBytes(byteLenth);
                        IPAddress ip           = new IPAddress(addressBytes);
                        int       port         = _msg.ReadInt32();
                        //connect
                        IPEndPoint endPoint = new IPEndPoint(ip, port);
                        Debug.WriteLine("Data::PeerInfo::Detecting if we're connected");
                        if (_peer.GetConnection(endPoint) == null)
                        {    //are we already connected?
                            //Don't try to connect to ourself!
                            if (_peer.Configuration.LocalAddress.GetHashCode() != endPoint.Address.GetHashCode() ||
                                _peer.Configuration.Port.GetHashCode() != endPoint.Port.GetHashCode())
                            {
                                Debug.WriteLine(string.Format("Data::PeerInfo::Initiate new connection to: {0}:{1}", endPoint.Address.ToString(), endPoint.Port.ToString()));
                                _peer.Connect(endPoint);
                            }
                        }
                    }
                    else if (mType == Enums.MessageType.Entity || mType == Enums.MessageType.EntityLight)
                    {
                        var    cbody      = new CBody();
                        var    ctransform = new CTransform();
                        string modelname  = "";
                        bool   isPlayer   = false;
                        int    id         = 0;
                        id = mType == Enums.MessageType.EntityLight ? _msg.ReadEntityLight(ref cbody, ref ctransform, ref modelname, ref isPlayer) : _msg.ReadEntity(ref cbody, ref ctransform, ref modelname, ref isPlayer);
                        Game1.Inst.Scene.Raise("entityupdate", new EntitySync {
                            ID = id, CBody = cbody, CTransform = ctransform, ModelFileName = modelname, IsPlayer = isPlayer
                        });
                    }
                    else if (mType == Enums.MessageType.CTransform)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadCTransform();
                        //Game1.Inst.Scene.Raise("network_data", data);
                    }
                    else if (mType == Enums.MessageType.Vector3)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadCTransform();
                        //Game1.Inst.Scene.Raise("network_data", data);
                    }
                    else if (mType == Enums.MessageType.CText)
                    {
                        var id   = _msg.ReadInt32();
                        var data = _msg.ReadCText();
                        Game1.Inst.Scene.Raise("network_menu_data_received", new MenuItem {
                            CText = data, Id = id
                        });
                    }
                    else if (mType == Enums.MessageType.Int32)
                    {
                        var metadata = _msg.ReadString();
                        var data     = _msg.ReadInt32();
                        if (metadata == "network_game_end")
                        {
                            Game1.Inst.Scene.Raise("game_end", data);
                        }
                    }
                    else if (mType == Enums.MessageType.PlayerInfo)
                    {
                        var date = _msg.ReadInt64();
                        if (!players.Any(x => x.IP == _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString()))
                        {
                            players.Add(new NetworkPlayer {
                                IP = _msg.SenderEndPoint.Address.ToString() + " " + _msg.SenderEndPoint.Port.ToString(), Time = new DateTime(date), You = false
                            });
                            Game1.Inst.Scene.Raise("update_peers", players.OrderBy(x => x.Time).ToList());
                        }
                    }
                    //Console.WriteLine("END ReceivePeersData Data");
                    break;

                case NetIncomingMessageType.UnconnectedData:
                    Debug.WriteLine("UnconnectedData: " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.VerboseDebugMessage:
                    Debug.WriteLine(NetIncomingMessageType.VerboseDebugMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.DebugMessage:
                    Debug.WriteLine(NetIncomingMessageType.DebugMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.WarningMessage:
                    Debug.WriteLine(NetIncomingMessageType.WarningMessage + " " + _msg.ReadString());
                    break;

                case NetIncomingMessageType.ErrorMessage:
                    Debug.WriteLine(NetIncomingMessageType.ErrorMessage + " " + _msg.ReadString());
                    break;

                default:
                    Debug.WriteLine("ReceivePeersData Unknown type: " + _msg.MessageType.ToString());
                    try
                    {
                        Debug.WriteLine(_msg.SenderConnection);
                        if (_msg.SenderConnection.Status == NetConnectionStatus.Disconnected)
                        {
                            //Maybe try to reconnect
                        }
                        Debug.WriteLine(_msg.ReadString());
                    }
                    catch
                    {
                        Debug.WriteLine("Couldn't parse unknown to string.");
                    }
                    break;
                }
            }
        }
Beispiel #21
0
        public static void CreateTriggerEvents(int numTriggers, int worldsize)
        {
            var    currentScene = Game1.Inst.Scene;
            Random rnd          = new Random();

            // TODO: get the global value of the worldsize
            for (int i = 0; i < numTriggers; i++)
            {
                int id = currentScene.AddEntity();
                var z  = (float)(rnd.NextDouble() * worldsize);
                var x  = (float)(rnd.NextDouble() * worldsize);
                currentScene.AddComponent(id, new CBody()
                {
                    Radius = 5, Aabb = new BoundingBox(new Vector3(-5, -5, -5), new Vector3(5, 5, 5)), LinDrag = 0.8f
                });
                currentScene.AddComponent(id, new CTransform()
                {
                    Position = new Vector3(x, -50, z), Scale = new Vector3(1f)
                });
                if (rnd.NextDouble() > 0.5)
                {
                    // Falling balls event
                    currentScene.OnEvent("collision", data => {
                        foreach (var player in Game1.Inst.Scene.GetComponents <CPlayer>().Keys)
                        {
                            if ((((PhysicsSystem.CollisionInfo)data).Entity1 == player &&
                                 ((PhysicsSystem.CollisionInfo)data).Entity2 == id)
                                ||
                                (((PhysicsSystem.CollisionInfo)data).Entity1 == id &&
                                 ((PhysicsSystem.CollisionInfo)data).Entity2 == player))
                            {
                                CTransform playerPosition =
                                    (CTransform)currentScene.GetComponentFromEntity <CTransform>(player);
                                for (var j = 0; j < 6; j++)
                                {
                                    var r = 0.6f + (float)rnd.NextDouble() * 2.0f;
                                    Utils.SceneUtils.CreateBall(
                                        new Vector3((float)Math.Sin(j) * j + playerPosition.Position.X,
                                                    playerPosition.Position.Y + 10f + 2.0f * j,
                                                    (float)Math.Cos(j) * j + playerPosition.Position.Z), // Position
                                        new Vector3(0.0f, -50.0f, 0.0f),                                 // Velocity
                                        r);                                                              // Radius
                                    //balls.Add(ballId);
                                }
                            }
                        }
                    });
                }
                else
                {
                    // Balls spawns around the player
                    currentScene.OnEvent("collision", data => {
                        foreach (var player in Game1.Inst.Scene.GetComponents <CPlayer>().Keys)
                        {
                            if ((((PhysicsSystem.CollisionInfo)data).Entity1 == player &&
                                 ((PhysicsSystem.CollisionInfo)data).Entity2 == id)
                                ||
                                (((PhysicsSystem.CollisionInfo)data).Entity1 == id &&
                                 ((PhysicsSystem.CollisionInfo)data).Entity2 == player))
                            {
                                CTransform playerPosition =
                                    (CTransform)currentScene.GetComponentFromEntity <CTransform>(player);
                                for (var j = 0; j < 6; j++)
                                {
                                    var r = 0.6f + (float)rnd.NextDouble() * 2.0f;
                                    Utils.SceneUtils.CreateBall(
                                        new Vector3((float)Math.Sin(j) * j + playerPosition.Position.X,
                                                    playerPosition.Position.Y + 2f,
                                                    (float)Math.Cos(j) * j + playerPosition.Position.Z), // Position
                                        new Vector3(0.0f, 0.0f, 0.0f),                                   // Velocity
                                        r);                                                              // Radius
                                    //balls.Add(ballId);
                                }
                            }
                        }
                    });
                }
            }
        }
Beispiel #22
0
 public void Run()
 {
     /*RaycastHit h;
      * bool hit = Physics.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Camera.main.transform.forward,out h);*/
     if (run)
     {
         RaycastHit2D hit = Physics2D.Raycast(Camera.main.ScreenToWorldPoint(Input.mousePosition), Vector2.zero);
         RunButtons(hit);
         foreach (HorizontalSlider hs in horizontalSliders)
         {
             hs.valuer.transform.localPosition = new Vector3(Mathf.Clamp(hs.valuer.transform.localPosition.x, hs.left.x, hs.right.x), 0, -0.01f);
             if (hit && /*h*/ hit.transform.gameObject == hs.valuer && Input.GetMouseButton(0))
             {
                 hs.drag = true;
             }
             if (Input.GetMouseButtonUp(0))
             {
                 hs.drag = false;
             }
             if (hs.drag)
             {
                 hs.value = CalculateValue(hs.left, hs.right, hs.valuer.transform.localPosition);
                 Vector2 position = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                 position.y = hs.valuer.transform.position.y;
                 Vector3 tmp = hs.valuer.transform.localPosition;
                 //tmp.x = position.x-hs.slider.transform.position.x;
                 tmp.x        += CInput.MouseSpeed().x *Time.deltaTime;
                 valuerdelta   = Input.mousePosition - valuerlastpos;
                 valuerlastpos = Input.mousePosition;
                 //tmp.y = position.y-hs.slider.transform.position.y;
                 hs.valuer.transform.localPosition = tmp;
                 //hs.valuer.transform.localPosition = new Vector3(hs.valuer.transform.localPosition.x, hs.valuer.transform.localPosition.y, -0.1f);
                 Debug.Log(hs.value);
                 hs.valuer.transform.localPosition = new Vector3(Mathf.Clamp(hs.valuer.transform.localPosition.x, hs.left.x, hs.right.x), 0, -0.01f);
             }
         }
         foreach (Label l in labels)
         {
             if (l.keepInPosition)
             {
                 if (l.target)
                 {
                     l.gameObject.GetComponent <RectTransform>().anchoredPosition = CTransform.WorldToScreenPosition(l.target.position, l.canvas.name);
                 }
                 else
                 {
                     l.gameObject.GetComponent <RectTransform>().anchoredPosition = CTransform.WorldToScreenPosition(l.position, l.canvas.name);
                 }
             }
         }
     }
     else
     {
         foreach (Button b in buttons)
         {
             if (b.isClicked)
             {
                 b.isClicked = false;
             }
         }
     }
 }
Beispiel #23
0
        public void DrawScene(CCamera camera, int excludeEid = -1)
        {
            // TODO: Clean code below up, hard to read.

            Game1.Inst.GraphicsDevice.Clear(new Color(Game1.Inst.Scene.LightConfig.ClearColor));

            Game1.Inst.GraphicsDevice.DepthStencilState = DepthStencilState.Default;

            foreach (CTransform transformComponent in Game1.Inst.Scene.GetComponents <CTransform>().Values)
            {
                transformComponent.Frame = Matrix.CreateScale(transformComponent.Scale) *
                                           transformComponent.Rotation *
                                           Matrix.CreateTranslation(transformComponent.Position);
            }

            var numDraws1 = 0;
            var numDraws  = 0;

            var device   = Game1.Inst.GraphicsDevice;
            var scene    = Game1.Inst.Scene;
            var frustrum = camera.Frustum;

            foreach (var component in scene.GetComponents <C3DRenderable>())
            {
                numDraws1++;
                var key = component.Key;

                if (key == excludeEid)
                {
                    // TODO: This is originally a hack to simplify rendering of environment maps.
                    continue;
                }

                C3DRenderable model = (C3DRenderable)component.Value;
                if (model.model == null)
                {
                    continue;                      // TODO: <- Should be an error, not silent fail?
                }
                CTransform transform = (CTransform)scene.GetComponentFromEntity <CTransform>(key);

                Matrix[] bones = new Matrix[model.model.Bones.Count];
                model.model.CopyAbsoluteBoneTransformsTo(bones);

                var anim = Matrix.Identity;
                if (model.animFn != null)
                {
                    anim = model.animFn(mT);
                }

                if (Game1.Inst.Scene.EntityHasComponent <CPlayer>(key))
                {
                    var cp = (CPlayer)Game1.Inst.Scene.GetComponentFromEntity <CPlayer>(key);
                    if (cp.HitId > 0)
                    {
                        var playerData = (CHit)Game1.Inst.Scene.GetComponentFromEntity <CHit>(cp.HitId);
                        if (playerData.IsAttacking)
                        {
                            bones[1] *= Matrix.CreateTranslation(0.0f, 0.5f, 0f);
                            bones[1] *= Matrix.CreateRotationX(2 * (float)Math.Sin(-playerData.AnimationProgress));
                            bones[1] *= Matrix.CreateTranslation(0.0f, -0.5f, 0f);
                        }
                    }
                }

                for (int k = 0; k < model.model.Meshes.Count; k++)
                {
                    var    mesh = model.model.Meshes[k];
                    string tag  = model.model.Tag as string;
                    // TODO: This is a really ugly hack. :-(
                    if (tag != "Heightmap")
                    {
                        if (frustrum.Contains(mesh.BoundingSphere.Transform(transform.Frame)) ==
                            ContainmentType.Disjoint)
                        {
                            break;
                        }
                    }

                    Effect lastEffect = null;
                    for (var i = 0; i < mesh.MeshParts.Count; i++)
                    {
                        var part = mesh.MeshParts[i];

                        if (part.PrimitiveCount == 0)
                        {
                            continue;
                        }

                        MaterialShader mat = null;

                        if (model.materials != null)
                        {
                            model.materials.TryGetValue(i, out mat);
                        }

                        var effect = mat?.mEffect ?? part.Effect;

                        if (lastEffect != effect)
                        {
                            if (mat != null)
                            {
                                mat.CamPos   = camera.Position;
                                mat.Model    = bones[mesh.ParentBone.Index] * anim * transform.Frame;
                                mat.View     = camera.View;
                                mat.Proj     = camera.Projection;
                                mat.FogStart = Game1.Inst.Scene.LightConfig.FogStart;
                                mat.FogEnd   = Game1.Inst.Scene.LightConfig.FogEnd;
                                mat.FogColor = Game1.Inst.Scene.LightConfig.ClearColor;
                                mat.Prerender();
                            }
                            else
                            {
                                SetupBasicEffect((BasicEffect)effect,
                                                 camera,
                                                 model,
                                                 scene,
                                                 transform,
                                                 mesh,
                                                 anim,
                                                 bones[mesh.ParentBone.Index],
                                                 Game1.Inst.Scene.LightConfig);
                            }

                            lastEffect = effect;
                        }

                        device.SetVertexBuffer(part.VertexBuffer);
                        device.Indices = part.IndexBuffer;

                        for (var j = 0; j < effect.CurrentTechnique.Passes.Count; j++)
                        {
                            effect.CurrentTechnique.Passes[j].Apply();

                            numDraws++;
                            device.DrawIndexedPrimitives(PrimitiveType.TriangleList,
                                                         part.VertexOffset,
                                                         0,
                                                         part.NumVertices,
                                                         part.StartIndex,
                                                         part.PrimitiveCount);
                        }
                    }
                }
            }

            //--------------------
            // Billboards
            //--------------------

            device.SetVertexBuffer(mBillboardVbo);
            device.Indices = mBillboardIbo;

            var bbMat = mBillboardMat;
            var pass0 = bbMat.mEffect.CurrentTechnique.Passes[0];

            bbMat.CamPos   = camera.Position;
            bbMat.Proj     = camera.Projection;
            bbMat.View     = camera.View;
            bbMat.FogStart = scene.LightConfig.FogStart;
            bbMat.FogEnd   = scene.LightConfig.FogEnd;
            bbMat.FogColor = scene.LightConfig.ClearColor;

            var camPos = camera.Position;
            var o      = camPos - camera.Target;

            o.Normalize();
            o *= 2.0f;

            foreach (var e in scene.GetComponents <CBillboard>())
            {
                var bb    = (CBillboard)e.Value;
                var bbRot = Matrix.CreateBillboard(bb.Pos, camPos + o, Vector3.Up, null);

                bbMat.Tex   = bb.Tex;
                bbMat.Model = Matrix.CreateScale(bb.Scale) * bbRot;
                bbMat.Prerender();
                pass0.Apply();

                device.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, 4, 0, 2);
            }

            foreach (var component in scene.GetComponents <CWater>())
            {
                var model = (C3DRenderable)component.Value;
                var key   = component.Key;

                if (key == excludeEid)
                {
                    // TODO: This is originally a hack to simplify rendering of environment maps.
                    continue;
                }
                CTransform transform = (CTransform)scene.GetComponentFromEntity <CTransform>(key);

                Matrix[] bones = new Matrix[model.model.Bones.Count];
                model.model.CopyAbsoluteBoneTransformsTo(bones);
                foreach (var mesh in model.model.Meshes)
                {
                    foreach (ModelMeshPart part in mesh.MeshParts)
                    {
                        Matrix world = mesh.ParentBone.Transform * transform.Frame;

                        part.Effect.Parameters["World"].SetValue(world);
                        part.Effect.Parameters["View"].SetValue(camera.View);
                        part.Effect.Parameters["Projection"].SetValue(camera.Projection);
                        part.Effect.Parameters["CameraPosition"].SetValue(camera.Position);
                        part.Effect.Parameters["Time"].SetValue(mT);

                        foreach (var pass in part.Effect.CurrentTechnique.Passes)
                        {
                            pass.Apply();
                        }

                        mesh.Draw();
                    }
                }
            }

            // -
        }
        internal static SchemaShape2D CreateShapeSchema(GeometryData shapeData, CPosition position, CDimension dimension, CTransform transform)
        {
            Matrix vertexTransform = CreateVertexTransform();

            Vector2[]     vertices     = CreateVertices();
            LineSegment[] lineSegments = CreateLineSegments();

            return(new SchemaShape2D(vertices, lineSegments));

            Matrix CreateVertexTransform()
            {
                return
                    (Matrix.CreateScale(dimension.Width * transform.Scale.X, dimension.Height * transform.Scale.Y, 1 * transform.Scale.Z) *

                     Matrix.CreateTranslation(-new Vector3(transform.RotationOffset.X, transform.RotationOffset.Y, 0)) *
                     Matrix.CreateRotationZ(transform.Rotation) *

                     Matrix.CreateTranslation(position.X + transform.Translation.X + transform.RotationOffset.X, position.Y + transform.Translation.Y + transform.RotationOffset.Y, transform.Translation.Z) *

                     Matrix.Identity);
            }

            Vector2[] CreateVertices()
            {
                Vector2[] result = new Vector2[shapeData.TotalVertices];

                for (int i = 0; i < shapeData.TotalVertices; i++)
                {
                    result[i] = Vector2.Transform(new Vector2(shapeData.Vertices[i].X, shapeData.Vertices[i].Y), vertexTransform);
                }

                return(result);
            }

            LineSegment[] CreateLineSegments()
            {
                int totalVertices = shapeData.TotalVertices;

                LineSegment[] result = new LineSegment[totalVertices];

                result[0] = new LineSegment(vertices[totalVertices - 1].X, vertices[totalVertices - 1].Y, vertices[0].X, vertices[0].Y);

                for (int i = 1; i < totalVertices; i++)
                {
                    result[i] = new LineSegment(vertices[i - 1].X, vertices[i - 1].Y, vertices[i].X, vertices[i].Y);
                }

                return(result);
            }
        }
Beispiel #25
0
        private NTROValue ReadField(ResourceIntrospectionManifest.ResourceDiskStruct.Field field, bool pointer)
        {
            switch (field.Type)
            {
            case DataType.Struct:
                var newStruct = Resource.IntrospectionManifest.ReferencedStructs.First(x => x.Id == field.TypeData);
                return(new NTROValue <NTROStruct>(field.Type, ReadStructure(newStruct, Reader.BaseStream.Position), pointer));

            case DataType.Enum:
                // TODO: Lookup in ReferencedEnums
                return(new NTROValue <uint>(field.Type, Reader.ReadUInt32(), pointer));

            case DataType.SByte:
                return(new NTROValue <sbyte>(field.Type, Reader.ReadSByte(), pointer));

            case DataType.Byte:
                return(new NTROValue <byte>(field.Type, Reader.ReadByte(), pointer));

            case DataType.Boolean:
                return(new NTROValue <bool>(field.Type, Reader.ReadByte() == 1 ? true : false, pointer));

            case DataType.Int16:
                return(new NTROValue <short>(field.Type, Reader.ReadInt16(), pointer));

            case DataType.UInt16:
                return(new NTROValue <ushort>(field.Type, Reader.ReadUInt16(), pointer));

            case DataType.Int32:
                return(new NTROValue <int>(field.Type, Reader.ReadInt32(), pointer));

            case DataType.UInt32:
                return(new NTROValue <uint>(field.Type, Reader.ReadUInt32(), pointer));

            case DataType.Float:
                return(new NTROValue <float>(field.Type, Reader.ReadSingle(), pointer));

            case DataType.Int64:
                return(new NTROValue <long>(field.Type, Reader.ReadInt64(), pointer));

            case DataType.ExternalReference:
                var id    = Reader.ReadUInt64();
                var value = id > 0
                        ? Resource.ExternalReferences?.ResourceRefInfoList.FirstOrDefault(c => c.Id == id)
                        : null;

                return(new NTROValue <ResourceExtRefList.ResourceReferenceInfo>(field.Type, value, pointer));

            case DataType.UInt64:
                return(new NTROValue <ulong>(field.Type, Reader.ReadUInt64(), pointer));

            case DataType.Vector:
                var vector3 = new Vector3(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());

                return(new NTROValue <Vector3>(field.Type, vector3, pointer));

            case DataType.Quaternion:
            case DataType.Color:
            case DataType.Fltx4:
            case DataType.Vector4D:
            case DataType.Vector4D_44:
                var vector4 = new Vector4(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());

                return(new NTROValue <Vector4>(field.Type, vector4, pointer));

            case DataType.String4:
            case DataType.String:
                return(new NTROValue <string>(field.Type, Reader.ReadOffsetString(Encoding.UTF8), pointer));

            case DataType.Matrix3x4:
            case DataType.Matrix3x4a:
                var matrix3x4a = new Matrix3x4(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());

                return(new NTROValue <Matrix3x4>(field.Type, matrix3x4a, pointer));

            case DataType.CTransform:
                var transform = new CTransform(
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle(),
                    Reader.ReadSingle());

                return(new NTROValue <CTransform>(field.Type, transform, pointer));

            default:
                throw new NotImplementedException($"Unknown data type: {field.Type} (name: {field.FieldName})");
            }
        }
Beispiel #26
0
        /// <summary>Checks for and solves collisions against the world bounds.</summary>
        /// <param name="eid">The ID of the entity to check.</param>
        /// <param name="body">The body component of the entity to check.</param>
        /// <param name="transf">The transform component of the entity to check.</param>
        /// <param name="aabb">The axis-aligned bounding box component of the entity to check.</param>
        private void CheckBodyWorld(int eid, CBody body, CTransform transf, BoundingBox aabb)
        {
            // This function is pretty trivial, so we can solve the collision immediately - no need to
            // store it for solving during the fine-solver phase. Basically, just check the bounding box
            // against the world bounds and bounce against them with full restitution. In practice, this
            // method should only be used to prevent objects from leaving universe to prevent
            // hard-to-detect errors in the physical simulation. Don't use it for in-game mechanics.

            if (aabb.Min.X < Bounds.Min.X)
            {
                transf.Position.X = Bounds.Min.X - body.Aabb.Min.X;
                body.Velocity.X  *= -body.Restitution;
            }
            else if (aabb.Max.X > Bounds.Max.X)
            {
                transf.Position.X = Bounds.Max.X - body.Aabb.Max.X;
                body.Velocity.X  *= -body.Restitution;
            }

            if (aabb.Min.Y < Bounds.Min.Y)
            {
                transf.Position.Y = Bounds.Min.Y - body.Aabb.Min.Y;
                body.Velocity.Y  *= -body.Restitution;
            }
            else if (aabb.Max.Y > Bounds.Max.Y)
            {
                transf.Position.Y = Bounds.Max.Y - body.Aabb.Max.Y;
                body.Velocity.Y  *= -body.Restitution;
            }

            if (aabb.Min.Z < Bounds.Min.Z)
            {
                transf.Position.Z = Bounds.Min.Z - body.Aabb.Min.Z;
                body.Velocity.Z  *= -body.Restitution;
            }
            else if (aabb.Max.Z > Bounds.Max.Z)
            {
                transf.Position.Z = Bounds.Max.Z - body.Aabb.Max.Z;
                body.Velocity.Z  *= -body.Restitution;
            }

            // If we have a map system, check that we don't fall below the ground. This part is part of
            // game mechanics.
            if (Heightmap != null)
            {
                //sometimes nan Values??
                if (double.IsNaN(transf.Position.X))
                {
                    return;
                }
                var mapHeight = Heightmap.HeightAt(transf.Position.X, transf.Position.Z);

                if (aabb.Min.Y < mapHeight)
                {
                    transf.Position.Y = mapHeight - body.Aabb.Min.Y;
                    body.Velocity.Y  *= -body.Restitution;

                    Scene.Raise("collisionwithground", new CollisionInfo {
                        Entity1 = eid
                    });
                }
            }
        }
Beispiel #27
0
    public void UpdateMouseInputs()
    {
        float dt = FrameController.DT();

        UpdateMousePosition();

        if (isPaperHeld || (rcCarScript != null && rcCarScript.isMouseHeld)) // Lock input until paper is put down
        {
            if (Input.GetTriggered(0, "MouseLClick") == 1.0f)
            {
                if (rcCarScript != null && rcCarScript.isMouseHeld)
                {
                    rcCarScript.isMouseHeld = false;
                }
                else
                {
                    pickedInteractable.OnTriggered();
                    isPaperHeld = false;
                }
            }
        }
        else
        {
            // Apply raycast of ocuPlayer's mouse to find any interactable object every frame (when mouse is not clicked)
            Vector3 ocuCamToMouse = (Vector3)gameObject.transform.position - (Vector3)ocuCam.transform.position;

            // Quick Hack to fix offset
            // Vector3 xAxis = ocuCam.transform.GetRightVector();
            // Vector3 yAxis = ocuCam.transform.GetUpVector();
            // ocuCamToMouse += xAxis * 0.055f;
            // ocuCamToMouse += yAxis * 0.12f;

            ocuCamToMouse.Normalize();
            if (Input.GetHeld(0, "MouseLClick") == 0.0f)
            {
                pickedObject = PhysicEngine.getInstance().RayCast3DWithTag(ocuCam.transform.position, ocuCamToMouse, 10000.0f, Common.tagForInteractables);

                pickedInteractable = null;
                // Check if mouse is over a valid camInMap
                if (pickedObject != null)
                {
                    pickedInteractable = GetScriptClass <InteractableObjectBaseClass>(pickedObject, false);
                    if (pickedInteractable != null)
                    {
                        pickedInteractable.OnMouseOver();

// The logic for ray casting through the camera screen into world objects
                        CameraScreen pickedScreen = pickedInteractable as CameraScreen;
                        if (pickedScreen != null && camScript.gameObjectParentedTo != null &&
                            camScript.gameObjectParentedTo != Common.GetNoiseStatic())
                        {
                            CTransform screenTrans = pickedScreen.gameObject.transform;
                            Vector3    screenPos   = screenTrans.position;
                            Vector3    rightVect   = screenTrans.GetRightVector();
                            Vector3    upVect      = screenTrans.GetUpVector();
                            Vector3    normal      = screenTrans.GetForwardVector();
                            Vector3    screenScale = screenTrans.GetScale();

                            Vector3 pointOnScreen = new Vector3();
                            MMath.RayToPlaneIntersection(normal, screenPos, ocuCamToMouse, ocuCam.transform.position, ref pointOnScreen);
                            Vector3 screenToPoint = pointOnScreen - screenPos;
                            float   xAmt          = -Vector3.Dot(screenToPoint, rightVect); // the camera screen's x is negative (to the left)
                            float   yAmt          = Vector3.Dot(screenToPoint, upVect);
                            float   xScaleOfModel = screenScale.X * 0.5f;                   // Reflect actual camera screen width in pixel units (quad is just nice 1 scale == 1 unit)
                            float   yScaleOfModel = screenScale.Y * 0.5f;
                            xAmt /= xScaleOfModel;                                          // [-0.5, 0.5]
                            yAmt /= yScaleOfModel;

                            float nearZ        = ocuCameraScreen.GetNearZ();
                            float screenWidth  = ocuCameraScreen.GetNearWindowWidth();
                            float screenHeight = ocuCameraScreen.GetNearWindowHeight();
                            xAmt *= screenWidth; // [-0.5, 0.5] -> [-w/2, w/2]
                            yAmt *= screenHeight;
                            // Use the x, y and z values through the actual camera look at directions
                            Vector3 innerCameraVect = xAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetRightVector() +
                                                      yAmt * (Vector3)camScript.gameObjectParentedTo.transform.GetUpVector() +
                                                      nearZ * (Vector3)camScript.gameObjectParentedTo.transform.GetForwardVector();
                            innerCameraVect.Normalize();

                            Vector3 cameraPos = camScript.gameObjectParentedTo.transform.position +
                                                0.5f * innerCameraVect; // Move in front, so it does not ray cast to the screen itself

                            GameObject cameraInteractable = PhysicEngine.getInstance().RayCast3DWithTag(cameraPos, innerCameraVect, 10000.0f, "camInteract");
                            if (cameraInteractable != null)
                            {
                                // If there is an interactable objec through the screen, check if there is ANY object infront of it
                                GameObject nearestObj = PhysicEngine.getInstance().RayCast3D(cameraPos, innerCameraVect, 10000.0f);
                                if (nearestObj == cameraInteractable)
                                {
                                    pickedInteractable = GetScriptClass <InteractableObjectBaseClass>(cameraInteractable, false);
                                    if (pickedInteractable != null)
                                    {
                                        pickedInteractable.OnMouseOver();
                                    }
                                }
                                else // There is something blocking
                                {
                                    Logger.Log("nearer Obj found: " + nearestObj.GetName());
                                }
                            }
                        }
                    }
                }
                // If prev interactable changed or is lost, call it's mouseOverOff
                if (prevPickedInteractable != pickedInteractable)
                {
                    if (prevPickedInteractable != null)
                    {
                        prevPickedInteractable.OnMouseOverOff();
                        if (Input.GetReleased(0, "MouseLClick") == 1.0f)
                        {
                            prevPickedInteractable.OnReleased();
                        }
                    }
                    prevPickedInteractable = pickedInteractable;
                }
            } // End of if not mouse held

            if (Input.GetTriggered(0, "MouseLClick") == 1.0f)
            {
                if (pickedInteractable != null)
                {
                    pickedInteractable.OnTriggered();

                    // If picked up paper, lock the input
                    Paper pickedPaper = pickedInteractable as Paper;
                    if (pickedPaper != null)
                    {
                        if (pickedPaper.GetIsHeldUp())
                        {
                            isPaperHeld = true;
                        }
                    }
                }
            }
            if (Input.GetHeld(0, "MouseLClick") == 1.0f)
            {
                if (pickedInteractable != null)
                {
                    pickedInteractable.OnHeldMouse(mCurrMouseMovement.X, mCurrMouseMovement.Y);
                }
            }
            if (Input.GetReleased(0, "MouseLClick") == 1.0f)
            {
                if (pickedInteractable != null)
                {
                    pickedInteractable.OnReleased();
                }
            }
        }
    }
Beispiel #28
0
        private void createEnvMapping()
        {
            C3DRenderable model     = null;
            CTransform    transform = null;

            foreach (var component in Game1.Inst.Scene.GetComponents <C3DRenderable>())
            {
                var key = component.Key;
                model = (C3DRenderable)component.Value;
                if (model.effect == null)
                {
                    continue;
                }
                transform = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(key);
            }
            RenderTarget2D renderTarget = new RenderTarget2D(Game1.Inst.GraphicsDevice, 256, 256);

            Game1.Inst.GraphicsDevice.Clear(Color.Black);
            Matrix view = Matrix.Identity;

            for (int i = 0; i < 6; i++)
            {
                // render the scene to all cubemap faces
                CubeMapFace cubeMapFace = (CubeMapFace)i;

                switch (cubeMapFace)
                {
                case CubeMapFace.NegativeX:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Left, Vector3.Up);
                    break;
                }

                case CubeMapFace.NegativeY:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Down, Vector3.Forward);
                    break;
                }

                case CubeMapFace.NegativeZ:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Backward, Vector3.Up);
                    break;
                }

                case CubeMapFace.PositiveX:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Right, Vector3.Up);
                    break;
                }

                case CubeMapFace.PositiveY:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Up, Vector3.Backward);
                    break;
                }

                case CubeMapFace.PositiveZ:
                {
                    view = Matrix.CreateLookAt(transform.Position, Vector3.Forward, Vector3.Up);
                    break;
                }
                }

                // Set the cubemap render target, using the selected face
                Game1.Inst.GraphicsDevice.SetRenderTarget(renderTarget);
                Game1.Inst.GraphicsDevice.Clear(Color.White);
                drawNormal(view);
                //skysystem.DrawOnRequest(view);

                Color[] colordata = new Color[256 * 256];
                renderTarget.GetData(colordata);
                model.environmentMap.SetData((CubeMapFace)i, colordata);
                //DEBUG
                Stream stream = File.Create("test" + i + ".jpg");
                renderTarget.SaveAsJpeg(stream, 256, 256);
                stream.Dispose();
                // restore our matrix after changing during the cube map rendering
                //view = Matrix.CreateLookAt(new Vector3(0, 0, 0), Vector3.Zero, Vector3.Up);
            }
            Game1.Inst.GraphicsDevice.SetRenderTarget(null);
        }
Beispiel #29
0
        public static void CreateAnimals(int numFlocks, int worldsize)
        {
            var currentScene = Game1.Inst.Scene;

            int membersPerFlock = (int)(rnd.NextDouble() * 10) + 10;
            var flockRadius     = membersPerFlock;

            for (int f = 0; f < numFlocks; f++)
            {
                int    flockId = currentScene.AddEntity();
                CFlock flock   = new CFlock {
                    Radius                 = 20,
                    SeparationDistance     = 3,
                    AlignmentFactor        = 0.1f,
                    CohesionFactor         = 0.5f,
                    SeparationFactor       = 100.0f,
                    PreferredMovementSpeed = 150f
                };

                double animal      = rnd.NextDouble();
                string flockAnimal = animal > 0.66 ? "flossy" : animal > 0.33 ? "goose" : "hen";
                string deathSound  = string.Format("Sounds/Effects/{0}", (flockAnimal == "flossy" ? "SheepDeath" : flockAnimal == "goose" ? "GooseDeath" : "DeathChicken"));

                int        flockX         = (int)(rnd.NextDouble() * worldsize * 2 - worldsize);
                int        flockZ         = (int)(rnd.NextDouble() * worldsize * 2 - worldsize);
                CTransform flockTransform = new CTransform {
                    Position = new Vector3(flockX, 0, flockZ)
                };

                for (int i = 0; i < membersPerFlock; i++)
                {
                    int id      = currentScene.AddEntity();
                    var npcAnim = wiggleAnimation(id);

                    if (flockAnimal.Equals("hen"))
                    {
                        // TODO: Make animals have different animations based on state
                        CAnimation normalAnimation = new CHenNormalAnimation {
                            animFn = npcAnim
                        };
                        // Set a random offset to animation so not all animals are synced
                        normalAnimation.CurrentKeyframe = rnd.Next(normalAnimation.Keyframes.Count - 1);
                        // Random animation speed between 0.8-1.0
                        normalAnimation.AnimationSpeed = (float)rnd.NextDouble() * 0.2f + 0.8f;
                        currentScene.AddComponent <C3DRenderable>(id, normalAnimation);
                    }
                    else
                    {
                        CImportedModel modelComponent = new CImportedModel {
                            animFn = npcAnim
                        };
                        modelComponent.fileName = flockAnimal;
                        modelComponent.model    = Game1.Inst.Content.Load <Model>("Models/" + modelComponent.fileName);
                        currentScene.AddComponent <C3DRenderable>(id, modelComponent);
                    }

                    float      memberX            = flockTransform.Position.X + (float)rnd.NextDouble() * flockRadius * 2 - flockRadius;
                    float      memberZ            = flockTransform.Position.Z + (float)rnd.NextDouble() * flockRadius * 2 - flockRadius;
                    float      y                  = flockTransform.Position.Y;
                    CTransform transformComponent = new CTransform();

                    transformComponent.Position = new Vector3(memberX, y, memberZ);
                    transformComponent.Rotation = Matrix.CreateFromAxisAngle(Vector3.UnitY,
                                                                             (float)(Math.PI * (rnd.NextDouble() * 2)));
                    float size = 0.5f;
                    transformComponent.Scale = new Vector3(1f);
                    currentScene.AddComponent(id, transformComponent);
                    currentScene.AddComponent(id, new CBody {
                        InvMass         = 0.05f,
                        Aabb            = new BoundingBox(-size * new Vector3(1.0f, 2.0f, 1.0f), size * new Vector3(1.0f, 0.0f, 1.0f)),
                        LinDrag         = 0.8f,
                        Velocity        = Vector3.Zero,
                        Radius          = 1f,
                        SpeedMultiplier = size,
                        MaxVelocity     = 4,
                        Restitution     = 0
                    });
                    // health value of npcs, maybe change per species/flock/member?
                    var npcHealth = 1;
                    currentScene.AddComponent(id, new CHealth {
                        MaxHealth = npcHealth, Health = npcHealth, DeathSound = deathSound
                    });
                    currentScene.AddComponent(id, new CAI {
                        Flock = flockId
                    });
                    currentScene.AddComponent(id, new CSyncObject());

                    flock.Members.Add(id);
                }
                currentScene.AddComponent(flockId, flock);
                currentScene.AddComponent(flockId, flockTransform);
            }
        }
Beispiel #30
0
        public void drawNormal(Matrix view)
        {
            Game1.Inst.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
            int counter = 0;

            foreach (CCamera camera in Game1.Inst.Scene.GetComponents <CCamera>().Values)
            {
                foreach (var component in Game1.Inst.Scene.GetComponents <C3DRenderable>())
                {
                    var           key   = component.Key;
                    C3DRenderable model = (C3DRenderable)component.Value;
                    if (model.model == null)
                    {
                        continue;
                    }
                    CTransform transform = (CTransform)Game1.Inst.Scene.GetComponentFromEntity <CTransform>(key);

                    var objectWorld = transform.ObjectWorld;

                    foreach (ModelMesh modelMesh in model.model.Meshes)
                    {
                        {
                            if (model.effect != null)
                            {
                                if (view.Equals(Matrix.Identity))
                                {
                                    view = camera.View;
                                }
                                foreach (ModelMeshPart part in modelMesh.MeshParts)
                                {
                                    part.Effect = model.effect;
                                    part.Effect.Parameters["World"].SetValue(modelMesh.ParentBone.Transform * objectWorld * world);
                                    part.Effect.Parameters["View"].SetValue(view);
                                    part.Effect.Parameters["Projection"].SetValue(camera.Projection);
                                    part.Effect.Parameters["AmbientColor"].SetValue(Color.White.ToVector3());
                                    part.Effect.Parameters["AmbientIntensity"].SetValue(0.1f);
                                    part.Effect.Parameters["LightDirection"].SetValue(new Vector3(0, 1f, 0));
                                    part.Effect.Parameters["SpecularPower"].SetValue(400f);
                                    part.Effect.Parameters["SpecularColor"].SetValue(Color.Gray.ToVector3());
                                    part.Effect.Parameters["SpecularIntensity"].SetValue(3.0f);
                                    part.Effect.Parameters["ViewVector"].SetValue(viewVector);
                                    part.Effect.Parameters["ModelTexture"].SetValue(model.texture);
                                    part.Effect.Parameters["BumpConstant"].SetValue(1f);
                                    part.Effect.Parameters["NormalMap"].SetValue(model.normalMap);
                                    part.Effect.Parameters["EnvTexture"].SetValue(model.environmentMap);
                                }
                                modelMesh.Draw();
                            }
                            if (model.effect == null)
                            {
                                foreach (BasicEffect effect in modelMesh.Effects)
                                {
                                    effect.World      = modelMesh.ParentBone.Transform * objectWorld * world;
                                    effect.View       = camera.View;
                                    effect.Projection = camera.Projection;

                                    effect.EnableDefaultLighting();
                                    effect.LightingEnabled = true;

                                    effect.DirectionalLight0.DiffuseColor  = new Vector3(1f, 1f, 1f);
                                    effect.DirectionalLight0.Direction     = new Vector3(-0.5f, 1f, -3.5f);
                                    effect.DirectionalLight0.SpecularColor = new Vector3(-0.1f, -0.1f, -0.1f);

                                    foreach (EffectPass p in effect.CurrentTechnique.Passes)
                                    {
                                        p.Apply();
                                        modelMesh.Draw();
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }