示例#1
0
        /// <summary>
        /// This method adds the static models to the chunks they stand upon
        /// </summary>
        public static void AddStaticModelsToChunks()
        {
            Entity e = ComponentManager.Instance.GetFirstEntityOfType <TerrainMapComponent>();

            if (e == null)
            {
                return;
            }

            TerrainMapComponent terrainComponent   = ComponentManager.Instance.GetEntityComponent <TerrainMapComponent>(e);
            TransformComponent  transformComponent = ComponentManager.Instance.GetEntityComponent <TransformComponent>(e);

            List <Entity> entModels = ComponentManager.Instance.GetAllEntitiesWithComponentType <ModelComponent>();

            if (entModels == null)
            {
                return;
            }

            for (int i = 0; i < terrainComponent.terrainChunks.Count; ++i)
            {
                Matrix world = Matrix.CreateTranslation(terrainComponent.terrainChunks[i].offsetPosition);

                //get the bounding box for the terrain chunk
                BoundingBox box = boxConvert.ConvertBoundingBoxToWorldCoords(terrainComponent.terrainChunks[i].boundingBox, world);

                for (int j = 0; j < entModels.Count; j++)
                {
                    TransformComponent           tComp  = ComponentManager.Instance.GetEntityComponent <TransformComponent>(entModels[j]);
                    ModelBoundingSphereComponent spComp = ComponentManager.Instance.GetEntityComponent <ModelBoundingSphereComponent>(entModels[j]);
                    ModelComponent mComp = ComponentManager.Instance.GetEntityComponent <ModelComponent>(entModels[j]);

                    //If there is a transformcomponent
                    if (tComp != null)
                    {
                        BoundingSphere newSphere;
                        //and a sphere component
                        if (spComp != null)
                        {
                            newSphere = sphereConvert.ConvertBoundingSphereToWorldCoords(spComp.sphere, tComp.World);


                            //if the box and the sphere overlaps
                            if (box.Intersects(newSphere))
                            {
                                //if it's a static model
                                if (mComp.staticModel.Equals(true))
                                {
                                    //add the entity to the chunk
                                    terrainComponent.terrainChunks[i].staticModels.Add(entModels[j]);
                                }
                            }
                        }
                    }
                }
            }
        }
示例#2
0
        public void Render(GraphicsDevice graphicsDevice, GameTime gameTime)
        {
            if (renderBoxInitialised.Equals(false))
            {
                boxConvert           = new BoundingBoxToWorldSpace();
                boxRenderer          = new DebugRenderBoundingBox(graphicsDevice);
                renderBoxInitialised = true;
            }

            Entity              e                  = ComponentManager.Instance.GetFirstEntityOfType <TerrainMapComponent>();
            Entity              c                  = ComponentManager.Instance.GetFirstEntityOfType <CameraComponent>();
            CameraComponent     camera             = ComponentManager.Instance.GetEntityComponent <CameraComponent>(c);
            TerrainMapComponent terrainComponent   = ComponentManager.Instance.GetEntityComponent <TerrainMapComponent>(e);
            TransformComponent  transformComponent = ComponentManager.Instance.GetEntityComponent <TransformComponent>(e);

            if (terrainComponent != null)
            {
                if (transformComponent != null)
                {
                    /*RasterizerState r = new RasterizerState();
                     * r.CullMode = CullMode.None;
                     * //r.FillMode = FillMode.WireFrame;
                     * graphicsDevice.RasterizerState = r;//*/

                    terrainComponent.numChunksInView = 0;
                    terrainComponent.numModelsInView = 0;

                    for (int i = 0; i < terrainComponent.terrainChunks.Count; ++i)
                    {
                        terrainComponent.terrainChunks[i].effect.TextureEnabled     = true;
                        terrainComponent.terrainChunks[i].effect.VertexColorEnabled = false;
                        terrainComponent.terrainChunks[i].effect.Texture            = terrainComponent.terrainChunks[i].terrainTex;
                        terrainComponent.terrainChunks[i].effect.Projection         = camera.projectionMatrix;
                        terrainComponent.terrainChunks[i].effect.View  = camera.viewMatrix;
                        terrainComponent.terrainChunks[i].effect.World = transformComponent.World * Matrix.CreateTranslation(terrainComponent.terrainChunks[i].offsetPosition);
                        terrainComponent.terrainChunks[i].effect.EnableDefaultLighting();

                        BoundingBox box = boxConvert.ConvertBoundingBoxToWorldCoords(terrainComponent.terrainChunks[i].boundingBox, terrainComponent.terrainChunks[i].effect.World);

                        if (box.Intersects(camera.cameraFrustrum))
                        {
                            foreach (EffectPass p in terrainComponent.terrainChunks[i].effect.CurrentTechnique.Passes)
                            {
                                p.Apply();
                                graphicsDevice.Indices = terrainComponent.terrainChunks[i].iBuffer;
                                graphicsDevice.SetVertexBuffer(terrainComponent.terrainChunks[i].vBuffer);
                                graphicsDevice.DrawIndexedPrimitives(PrimitiveType.TriangleList, 0, 0, terrainComponent.terrainChunks[0].indicesLenDiv3);
                            }
                            boxRenderer.RenderBoundingBox(terrainComponent.terrainChunks[i].boundingBox, terrainComponent.terrainChunks[i].effect.World, camera.viewMatrix, camera.projectionMatrix);
                            terrainComponent.numChunksInView++;

                            //go through all the entities in the current chunk
                            foreach (Entity staticModelEnt in terrainComponent.terrainChunks[i].staticModels)
                            {
                                //get the transform and modelcomponent
                                TransformComponent           tComp = ComponentManager.Instance.GetEntityComponent <TransformComponent>(staticModelEnt);
                                ModelComponent               mComp = ComponentManager.Instance.GetEntityComponent <ModelComponent>(staticModelEnt);
                                ModelBoundingSphereComponent sp    = ComponentManager.Instance.GetEntityComponent <ModelBoundingSphereComponent>(staticModelEnt);

                                BoundingSphere newSphere = sphereConvert.ConvertBoundingSphereToWorldCoords(sp.sphere, Matrix.CreateTranslation(tComp.Position));
                                newSphere.Radius += 0.5f;

                                foreach (var pair in mComp.meshTransforms)
                                {
                                    //update the model transforms
                                    ChangeBoneTransform(mComp, pair.Key, pair.Value);
                                }

                                //if they use the basic effect
                                if (mComp.useBasicEffect)
                                {
                                    //and are within the camera frustrum
                                    if (camera.cameraFrustrum.Contains(newSphere) != ContainmentType.Disjoint)
                                    {
                                        terrainComponent.numModelsInView++;

                                        //render the model with basic effects
                                        modelRenderMethods.RenderBasicEffectModel(mComp, tComp, camera, false);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        public InitHouses(ECSEngine engine)
        {
            Random              rnd           = new Random();
            ModelComponent      house         = new ModelComponent(engine.LoadContent <Model>("basichouse"), true, true, true);
            ModelComponent      house2        = new ModelComponent(engine.LoadContent <Model>("basichouse"), true, true, true);
            ModelComponent      powerupModel  = new ModelComponent(engine.LoadContent <Model>("basichouse"), true, true, false);
            List <Entity>       sceneEntities = SceneManager.Instance.GetActiveScene().GetAllEntities();
            Entity              terrain       = ComponentManager.Instance.GetEntityWithTag("Terrain", sceneEntities);
            TerrainMapComponent tcomp         = ComponentManager.Instance.GetEntityComponent <TerrainMapComponent>(terrain);

            // Init test-powerup

            Entity entity = EntityFactory.Instance.NewEntity();

            powerupModel.SetTexture(engine.LoadContent <Texture2D>("basichouse_texture1"));
            powerupModel.textured = true;
            ComponentManager.Instance.AddComponentToEntity(entity, powerupModel);

            TransformComponent tt = new TransformComponent();
            float hh = (float)rnd.Next(8, 12) / 100;

            tt.Position = new Vector3(500, 35, -50);
            tt.Scale    = new Vector3(0.08f, hh, 0.08f);
            ComponentManager.Instance.AddComponentToEntity(entity, tt);

            ComponentManager.Instance.AddComponentToEntity(entity, new Collision3Dcomponent());
            ComponentManager.Instance.AddComponentToEntity(entity, new PowerupModelComponent());

            SceneManager.Instance.AddEntityToSceneOnLayer("Game", 1, entity);

            // Init houses
            for (int i = 0; i < 1; ++i)
            {
                Entity e = EntityFactory.Instance.NewEntity();

                if (i < 50)
                {
                    house.SetTexture(engine.LoadContent <Texture2D>("basichouse_texture1"));
                    house.textured = true;
                    ComponentManager.Instance.AddComponentToEntity(e, house);
                }
                else
                {
                    house2.SetTexture(engine.LoadContent <Texture2D>("basichouse_texture2"));
                    house2.textured = true;
                    ComponentManager.Instance.AddComponentToEntity(e, house2);
                }

                TransformComponent t = new TransformComponent();
                float minx           = rnd.Next(128, 900);
                float minz           = rnd.Next(128, 900);
                float houseHeight    = (float)rnd.Next(8, 12) / 100;
                t.Position = new Vector3(minx, 0.0f, -minz);
                t.Position = new Vector3(t.Position.X, TerrainMapRenderSystem.GetTerrainHeight(tcomp, t.Position.X, Math.Abs(t.Position.Z)), t.Position.Z);
                t.Scale    = new Vector3(0.08f, houseHeight, 0.08f);
                t.World    = Matrix.CreateTranslation(t.Position);

                //house and house2 are identical, so it's ok to use either of them
                ModelBoundingSphereComponent sphereComp = new ModelBoundingSphereComponent(house, t.Position);

                ComponentManager.Instance.AddComponentToEntity(e, t);
                ComponentManager.Instance.AddComponentToEntity(e, sphereComp);
                ComponentManager.Instance.AddComponentToEntity(e, new Collision3Dcomponent());

                SceneManager.Instance.AddEntityToSceneOnLayer("Game", 1, e);
            }
        }