/// <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]); } } } } } } }
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); } } } } } } } }
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); } }