/// <summary> /// Baut ein Terrain-Modell /// </summary> /// <param name="name">Name des Modells</param> /// <param name="heightmap">Height Map Textur</param> /// <param name="texture">Textur der Oberfläche</param> /// <param name="width">Breite</param> /// <param name="height">Höhe</param> /// <param name="depth">Tiefe</param> /// <param name="texRepeatX">Texturwiederholung Breite</param> /// <param name="texRepeatZ">Texturwiederholung Tiefe</param> /// <param name="isFile">false, wenn die Texturen Teil der EXE sind (Eingebettete Ressource)</param> public static void BuildTerrainModel(string name, string heightmap, string texture, float width, float height, float depth, float texRepeatX = 1, float texRepeatZ = 1, bool isFile = true) { if (Models.ContainsKey(name)) { throw new Exception("There already is a model with that name. Please choose a different name."); } GeoModel terrainModel = new GeoModel(); terrainModel.Name = name; terrainModel.Meshes = new Dictionary <string, GeoMesh>(); terrainModel.IsValid = true; GeoMeshHitbox meshHitBox = new GeoMeshHitbox(0 + width / 2, 0 + height / 2, 0 + depth / 2, 0 - width / 2, 0 - height / 2, 0 - depth / 2); meshHitBox.Model = terrainModel; meshHitBox.Name = name; terrainModel.MeshHitboxes = new List <GeoMeshHitbox>(); terrainModel.MeshHitboxes.Add(meshHitBox); GeoTerrain t = new GeoTerrain(); GeoMesh terrainMesh = t.BuildTerrain(new Vector3(0, 0, 0), heightmap, width, height, depth, texRepeatX, texRepeatZ, isFile); terrainMesh.Terrain = t; GeoMaterial mat = new GeoMaterial(); mat.BlendMode = OpenTK.Graphics.OpenGL4.BlendingFactor.OneMinusSrcAlpha; mat.ColorDiffuse = new Vector4(1, 1, 1, 1); mat.ColorEmissive = new Vector4(0, 0, 0, 0); mat.Name = name + "-Material"; mat.SpecularArea = 512; mat.SpecularPower = 0; GeoTexture texDiffuse = new GeoTexture(name + "-TextureDiffuse"); texDiffuse.Filename = texture; texDiffuse.Type = GeoTexture.TexType.Diffuse; texDiffuse.UVMapIndex = 0; texDiffuse.UVTransform = new Vector2(texRepeatX, texRepeatZ); bool dictFound = CustomTextures.TryGetValue(CurrentWorld, out Dictionary <string, int> texDict); if (dictFound && texDict.ContainsKey(texture)) { texDiffuse.OpenGLID = texDict[texture]; } else { texDiffuse.OpenGLID = isFile ? HelperTexture.LoadTextureForModelExternal(texture) : HelperTexture.LoadTextureForModelInternal(texture); if (dictFound) { texDict.Add(texture, texDiffuse.OpenGLID); } } mat.TextureDiffuse = texDiffuse; terrainMesh.Material = mat; terrainModel.Meshes.Add("Terrain", terrainMesh); KWEngine.Models.Add(name, terrainModel); }
/// <summary> /// Baut ein Terrain-Modell /// </summary> /// <param name="name">Name des Modells</param> /// <param name="heightmap">Height Map Textur</param> /// <param name="texture">Textur der Oberfläche</param> /// <param name="width">Breite</param> /// <param name="height">Höhe</param> /// <param name="depth">Tiefe</param> /// <param name="texRepeatX">Texturwiederholung Breite</param> /// <param name="texRepeatZ">Texturwiederholung Tiefe</param> /// <param name="isFile">false, wenn die Texturen Teil der EXE sind (Eingebettete Ressource)</param> public static void BuildTerrainModel(string name, string heightmap, string texture, float width, float height, float depth, float texRepeatX = 1, float texRepeatZ = 1, bool isFile = true) { if (Models.ContainsKey(name)) { HelperGeneral.ShowErrorAndQuit("KWEngine::BuildTerrainModel()", "There already is a model with that name. Please choose a different name."); return; } GeoModel terrainModel = new GeoModel(); terrainModel.Name = name; terrainModel.Meshes = new Dictionary <string, GeoMesh>(); terrainModel.IsValid = true; GeoMeshHitbox meshHitBox = new GeoMeshHitbox(0 + width / 2, 0 + height / 2, 0 + depth / 2, 0 - width / 2, 0 - height / 2, 0 - depth / 2, null); meshHitBox.Model = terrainModel; meshHitBox.Name = name; terrainModel.MeshHitboxes = new List <GeoMeshHitbox>(); terrainModel.MeshHitboxes.Add(meshHitBox); GeoTerrain t = new GeoTerrain(); GeoMesh terrainMesh = t.BuildTerrain2(new Vector3(0, 0, 0), heightmap, width, height, depth, texRepeatX, texRepeatZ, isFile); terrainMesh.Terrain = t; GeoMaterial mat = new GeoMaterial(); mat.BlendMode = BlendingFactor.OneMinusSrcAlpha; mat.ColorAlbedo = new Vector4(1, 1, 1, 1); mat.ColorEmissive = new Vector4(0, 0, 0, 0); mat.Opacity = 1; mat.Metalness = 0; mat.Roughness = 1; GeoTexture texDiffuse = new GeoTexture(); texDiffuse.Filename = texture; texDiffuse.Type = TextureType.Albedo; texDiffuse.UVMapIndex = 0; texDiffuse.UVTransform = new Vector2(texRepeatX, texRepeatZ); bool dictFound = CustomTextures.TryGetValue(CurrentWorld, out Dictionary <string, int> texDict); if (dictFound && texDict.ContainsKey(texture)) { texDiffuse.OpenGLID = texDict[texture]; } else { int texId = isFile ? HelperTexture.LoadTextureForModelExternal(texture) : HelperTexture.LoadTextureForModelInternal(texture); texDiffuse.OpenGLID = texId > 0 ? texId : KWEngine.TextureDefault; if (dictFound && texId > 0) { texDict.Add(texture, texDiffuse.OpenGLID); } } mat.TextureAlbedo = texDiffuse; terrainMesh.Material = mat; terrainModel.Meshes.Add("Terrain", terrainMesh); KWEngine.Models.Add(name, terrainModel); }