static public MeshData CreateTextMesh(string message, PixelFont font, float step) { MeshData textMesh = new MeshData(); textMesh.sourceFileName = "text_mesh: " + message; textMesh.positions = new List<Vector3>(); textMesh.texCoords = new List<Vector2>(); textMesh.indices = new List<int>(); textMesh.hasPositionData = true; textMesh.hasTexCoordData = true; textMesh.hasIndexData = true; List<Vector2> uvs = font.GetUVsOfString(message); Vector2 uvStep = font.GetLetterUVSize(); int letters = message.Length; float size = 1.0f; float xstart = 0.0f - (letters * step) * 0.5f; int ind = 0; for (int i = 0; i < letters; i++) { textMesh.positions.Add(new Vector3(xstart + 0.0f, 0.0f, 0.0f)); // 0 L B textMesh.positions.Add(new Vector3(xstart + 0.0f, size, 0.0f)); // 1 L T textMesh.positions.Add(new Vector3(xstart + size, size, 0.0f)); // 2 R T textMesh.positions.Add(new Vector3(xstart + size, 0.0f, 0.0f)); // 3 R B // We are given the upper left corner in uvs[] // but the quads start from lower left // Texture coordinates Y decreases downwards, top is 1 float uX = uvs[i].X; // L float uY = uvs[i].Y; // T float uW = uX + uvStep.X; // R float uH = uY - uvStep.Y; // B textMesh.texCoords.Add(new Vector2(uX, uH)); // L B textMesh.texCoords.Add(new Vector2(uX, uY)); // L T textMesh.texCoords.Add(new Vector2(uW, uY)); // R T textMesh.texCoords.Add(new Vector2(uW, uH)); // R B textMesh.indices.Add(ind); textMesh.indices.Add(ind + 3); textMesh.indices.Add(ind + 2); textMesh.indices.Add(ind); textMesh.indices.Add(ind + 2); textMesh.indices.Add(ind + 1); ind += 4; xstart += step; } textMesh.drawType = MeshData.DataDrawType.Triangles; textMesh.GenerateBufferHandles(); Error.checkGLError("Text Mesh Data creation"); return textMesh; }
public void CreateGreets(TunableManager tm, AssetManager assetManager , string greetName , PixelFont greetFont , string greet_material , Vector3 greetColor , ShaderProgram greetShader , Vector3 greetOffset , Vector3 greetSpacing , float greetScale , float letterStep , TransformComponent parentTransform , ref List <GreetPage> greetsOut) { int gp = tm.GetInt(greetName + ".greet_pages"); for (int pi = 0; pi < gp; pi++) { GreetPage page = new GreetPage(); page.greets = new List <Greeting>(); string pageName = greetName + "_page_" + (pi + 1); int greet_amount = tm.GetInt(pageName + "." + "greet_amount"); for (int gi = 0; gi < greet_amount; gi++) { Greeting greet = new Greeting(); greet.textMesh = assetManager.CreateMesh("greet" + gi , MeshDataGenerator.CreateTextMesh(tm.GetString(pageName + "." + "greet_" + (gi + 1)) , greetFont, letterStep) , greet_material , greetShader , new Vector3(0, 0, 0)); greet.alpha = 1.0f; greet.color = greetColor; page.greets.Add(greet); } greetsOut.Add(page); } for (int pi = 0; pi < greetsOut.Count; pi++) { GreetPage p = greetsOut[pi]; for (int gi = 0; gi < p.greets.Count; gi++) { Greeting g = p.greets[gi]; g.textMesh.Transform.Parent = parentTransform; Vector3 offset = greetOffset + (greetSpacing * gi); g.textMesh.Transform.Translation = new Vector4(offset, 1.0f); g.textMesh.Transform.Scale = greetScale; } } }
public void Load(AssetManager assetManager, SyncSystem syncSystem) { TunableManager tm = TunableManager.GetSingleton(); lightController = new InstanssiLightController( tm.GetString("demosettings.light_server_ip") , tm.GetString("demosettings.light_server_host_name") , tm.GetInt("demosettings.light_server_port") , tm.GetInt("bunny_lights.amount") , tm.GetInt("demosettings.physical_lights_amount") , tm.GetInt("demosettings.light_server_interval")); mountainsNumber = tm.GetInt("scene_number.mountains"); moonNumber = tm.GetInt("scene_number.moon"); bunnyNumber = tm.GetInt("scene_number.bunny"); warpNumber = tm.GetInt("scene_number.warp"); seaNumber = tm.GetInt("scene_number.sea"); crystalsNumber = tm.GetInt("scene_number.crystals"); // Audio Logger.LogInfo("Loading demo audio"); string audioFileName = tm.GetString("audio.filename"); music = audioSystem.LoadAudioFile(audioFileName); syncSystem.SetAudioProperties(tm.GetInt("audio.bpm"), tm.GetFloat("audio.length_seconds") , tm.GetInt("audio.rows_per_beat")); syncSystem.SetManualSceneAdvanceRate(tm.GetFloat("sync.manual_scene_advance_speed")); // Camera CameraComponent camera = Renderer.GetSingleton().GetCamera(); camera.FOV = tm.GetFloat("camera.fov"); camera.Speed = tm.GetFloat("camera.speed"); camera.SpeedStep = tm.GetFloat("camera.speed_step"); camera.Near = tm.GetFloat("camera.near_plane"); camera.Far = tm.GetFloat("camera.far_plane"); camera.CreateMatrices(); // Camera frames Logger.LogInfo("Loading demo frames"); List <PosAndDir> frames = new List <PosAndDir>(); int frameAmount = tm.GetInt("camera_frames.amount"); for (int frameI = 0; frameI < frameAmount; frameI++) { Vector3 pos = tm.GetVec3("camera_frames.frame_" + frameI + "_pos"); Vector3 dir = tm.GetVec3("camera_frames.frame_" + frameI + "_dir"); frames.Add(new PosAndDir(pos, dir)); } Renderer.GetSingleton().SetCameraFrames(frames); // Shaders Logger.LogInfo("Loading demo shaders"); ShaderProgram diamondShader = assetManager.GetShaderProgram("diamond"); ShaderProgram texShader = assetManager.GetShaderProgram("texturedobjmesh"); ShaderProgram gridShader = assetManager.GetShaderProgram("gridmesh"); ShaderProgram objShader = assetManager.GetShaderProgram("litobjmesh"); ShaderProgram skyboxProgram = assetManager.GetShaderProgram("skybox"); ShaderProgram starProgram = assetManager.GetShaderProgram("sky"); guiShader = assetManager.GetShaderProgram("gui"); cameraFOV = syncSystem.GetTrack("FOV"); warpFOV = syncSystem.GetTrack("W_FOV"); // Fade if (guiShader == null) { Logger.LogError(Logger.ErrorState.Critical, "Did not get gui shader"); } fadeoutAlpha = syncSystem.GetTrack("FadeOut"); Material fadeoutMaterial = new Material("blackfadeout"); fadeoutMaterial.textureMaps.Add(ShaderUniformName.DiffuseMap, MaterialManager.GetSingleton().GetColorTextureByName("black")); MaterialManager.GetSingleton().AddNewMaterial(fadeoutMaterial); fadeoutQuad = assetManager.CreateMesh("black_overlay" , MeshDataGenerator.CreateQuadMesh(false, true) , fadeoutMaterial.materialName , guiShader , tm.GetVec3("fade.position")); fadeoutQuad.Transform.Scale = tm.GetFloat("fade.scale"); // Skybox starSkyBox = assetManager.CreateMesh("stars" , MeshDataGenerator.CreateSkybox() , null , skyboxProgram , new Vector3(0, 0, 0)); starSkyboxMaterial = assetManager.GetMaterial(tm.GetString("mountain_scene.skybox_material")); starSkyBox.Transform.SetRotationAxis(tm.GetVec3("mountain_scene.star_rotation_axis")); skyRotation = syncSystem.GetTrack("Sky_R"); // Lights mountainLight = Light.CreateDirectionalLight(tm.GetVec3("mountain_light.color") , tm.GetFloat("mountain_light.ambient"), tm.GetFloat("mountain_light.intensity") , tm.GetVec3("mountain_light.direction")); // Models Logger.LogInfo("Loading demo models"); Logger.LogInfo(" - Bunny"); bunnyMesh = assetManager.GetMesh("bunny" , tm.GetString("bunny.model") , tm.GetString("bunny.material") , assetManager.GetShaderProgram(tm.GetString("bunny.shader")) , tm.GetVec3("bunny.position")); bunnyMesh.Transform.Scale = tm.GetFloat("bunny.scale"); bunnyMesh.Transform.SetRotationAxis(new Vector3(0, 1, 0)); bunnyRotation = syncSystem.GetTrack("bunny_R"); bunnyLights = new List <LightMesh>(); int bunnyLightAmount = tm.GetInt("bunny_lights.amount"); LoadLightMeshList(tm, assetManager, bunnyMesh.Transform, "bunny_lights", bunnyLightAmount, texShader, ref bunnyLights); bunnyLightsSizesLocations = new List <int>(); for (int i = 0; i < bunnyLights.Count; i++) { int location = bunnyMesh.ShaderProgram.GetCustomUniformLocation("ucLightSizes[" + i + "]"); bunnyLightsSizesLocations.Add(location); } bunnyLightProgress = syncSystem.GetTrack("bunny_L"); Logger.LogInfo(" - Monolith"); monolith = assetManager.CreateMesh("monolith" , MeshDataGenerator.CreateCubeMesh(tm.GetVec3("monolith.size") , true, true) , tm.GetString("monolith.material") , objShader , tm.GetVec3("monolith.position")); monolith.Transform.SetRotationAxis(new Vector3(0, 1, 0)); monolith.Transform.Scale = tm.GetFloat("monolith.scale"); monolithRotation = syncSystem.GetTrack("mono_R"); monolithElevation = syncSystem.GetTrack("mono_Y"); // DEBUG monolith_normals = assetManager.CreateMesh("mono_N" , MeshDataGenerator.CreateNormalDebug(monolith.Data.positions, monolith.Data.normals) , null , gridShader , monolith.Transform.GetWorldPosition()); monolith_normals.Transform.Parent = monolith.Transform; Logger.LogInfo(" - Telescope"); telescope = new Telescope(); telescope.tower = assetManager.GetMesh("tele_tower" , tm.GetString("telescope.tower_model") , tm.GetString("telescope.material") , objShader , tm.GetVec3("telescope.tower_position")); telescope.tower.Transform.Scale = tm.GetFloat("telescope.tower_scale"); telescope.tower.Transform.SetRotationAxis(new Vector3(0, 1, 0)); telescope.antenna = assetManager.GetMesh("tele_antenna" , tm.GetString("telescope.antenna_model") , tm.GetString("telescope.material") , objShader , tm.GetVec3("telescope.antenna_position")); telescope.antenna.Transform.Scale = tm.GetFloat("telescope.antenna_scale"); telescope.antenna.Transform.SetRotationAxis(new Vector3(0, 0, 1)); telescope.antenna.Transform.Parent = telescope.tower.Transform; telescopeElevation = syncSystem.GetTrack("Tele_Elev"); telescopeRotation = syncSystem.GetTrack("Tele_Rot"); mainTelescopePosition = tm.GetVec3("telescope.tower_position"); // Telescope array int teleAmount = tm.GetInt("telescope_array.amount"); Vector3 teleArrayCorner = tm.GetVec3("telescope_array.position"); Vector3 teleArrayDir1 = tm.GetVec3("telescope_array.dir"); Vector3 teleArrayDir2 = tm.GetVec3("telescope_array.dir2"); float spacing = tm.GetFloat("telescope_array.spacing"); telescopeArrayPositions = new List <Vector3>(); for (int t = 0; t < teleAmount; t++) { telescopeArrayPositions.Add(teleArrayCorner + teleArrayDir1 * spacing * (t + 1)); telescopeArrayPositions.Add(teleArrayCorner + teleArrayDir2 * spacing * (t + 1)); } // Sea Logger.LogInfo(" - Sea"); seaShader = assetManager.GetShaderProgram("heightMapTerrain"); Vector2 seaSize = tm.GetVec2("sea.size"); float seaTrianglesDensity = tm.GetFloat("sea.detail_level"); Vector2 seaUVRepeat = tm.GetVec2("sea.UV_repeat"); seaMesh = assetManager.CreateMesh("sea" , MeshDataGenerator.CreateTerrain(seaSize.X, seaSize.Y, seaTrianglesDensity, true, true , seaUVRepeat.X, seaUVRepeat.Y) , tm.GetString("sea.material") , objShader , tm.GetVec3("sea.position")); // Planet mountains Logger.LogInfo(" - Planet Mountains"); planetMountains = assetManager.CreateMesh("planet_mountains" , MeshDataGenerator.CreateMountains( tm.GetFloat("planet_mountain.size") , true, tm.GetInt("planet_mountain.iterations") , tm.GetFloat("planet_mountain.height_variation") , tm.GetFloat("planet_mountain.flat_start") , tm.GetFloat("planet_mountain.flat_end") , tm.GetInt("planet_mountain.random_seed")) , tm.GetString("planet_mountain.material") , objShader , tm.GetVec3("planet_mountain.position")); planetLight = Light.CreateDirectionalLight(tm.GetVec3("planet_light.color") , tm.GetFloat("planet_light.ambient"), tm.GetFloat("planet_light.intensity") , tm.GetVec3("planet_light.direction")); planetSkyBox = assetManager.CreateMesh("planet_skybox" , MeshDataGenerator.CreateSkybox() , null , skyboxProgram , new Vector3(0, 0, 0)); planetSkyboxMaterial = assetManager.GetMaterial("planet_skybox"); // Mountains Logger.LogInfo(" - Mountains"); mountains = assetManager.CreateMesh("mountains" , MeshDataGenerator.CreateMountains( tm.GetFloat("mountain.size") , true, tm.GetInt("mountain.iterations") , tm.GetFloat("mountain.height_variation") , tm.GetFloat("mountain.flat_start") , tm.GetFloat("mountain.flat_end") , tm.GetInt("mountain.random_seed")) , tm.GetString("mountain.material") , objShader , tm.GetVec3("mountain.position")); // Crystals Logger.LogInfo(" - Crystals"); crystalMeshes = new List <Crystal>(); int crystalAmount = tm.GetInt("crystals.amount"); Random randomizer = new Random(0); float areaSize = tm.GetFloat("crystals.area_size"); float areaTop = tm.GetFloat("crystals.area_top"); Vector3 areaPos = tm.GetVec3("crystals.area_pos"); float maxSpeed = tm.GetFloat("crystals.max_speed"); float sizeMin = tm.GetFloat("crystals.min_size"); float sizeMax = tm.GetFloat("crystals.max_size"); for (int s = 0; s < crystalAmount; s++) { Crystal c = new Crystal(); Vector3 position = new Vector3((float)randomizer.NextDouble() - 0.5f , (float)randomizer.NextDouble() , (float)randomizer.NextDouble() - 0.5f); position = position * new Vector3(areaSize, areaSize, areaSize); position += areaPos; c.mesh = assetManager.CreateMesh("crystal_" + s , MeshDataGenerator.CreateStar(new Vector3(1.0f, 0, 0), new Vector3(0, 1, 0) , 1.0f, 2.0f, 0.5f, 0.8f, true) , tm.GetString("crystals.material") , assetManager.GetShaderProgram(tm.GetString("crystals.shader")) , position); c.mesh.Transform.Scale = sizeMin + (float)randomizer.NextDouble() * (sizeMax - sizeMin); c.mesh.Transform.SetRotationAxis(position.Normalized()); c.speed = (float)randomizer.NextDouble() * maxSpeed; crystalMeshes.Add(c); } crystalsGravity = tm.GetFloat("crystals.gravity"); Logger.LogInfo("Creating greetings"); // Title, Greets and credits TextGenerator textgen = TextGenerator.GetSingleton(); string greet_font = tm.GetString("text.font"); PixelFont greetFont = textgen.GetFont(greet_font); string greet_material = tm.GetString("text.material"); ShaderProgram greetShader = assetManager.GetShaderProgram(tm.GetString("text.shader")); float textStep = tm.GetFloat("text.step"); // Title string titleMaterial = tm.GetString("mountain_text.title_material"); string groupMaterial = tm.GetString("mountain_text.group_material"); DrawableMesh groupName = assetManager.CreateMesh("groupText" , MeshDataGenerator.CreateQuadMesh(false, true) , groupMaterial , greetShader , tm.GetVec3("mountain_scene.group_name_position")); groupName.Transform.Scale = tm.GetFloat("mountain_scene.group_name_scale"); groupNameGreet = new Greeting(); groupNameGreet.textMesh = groupName; groupNameGreet.alpha = 0.0f; groupNameGreet.color = tm.GetVec3("mountain_text.color"); DrawableMesh demoName = assetManager.CreateMesh("groupText" , MeshDataGenerator.CreateQuadMesh(false, true) , titleMaterial , greetShader , tm.GetVec3("mountain_scene.demo_name_position")); demoName.Transform.Scale = tm.GetFloat("mountain_scene.demo_name_scale"); demoNameGreet = new Greeting(); demoNameGreet.textMesh = demoName; demoNameGreet.alpha = 0.0f; demoNameGreet.color = tm.GetVec3("mountain_text.color"); // Greets Vector3 greetOffset = tm.GetVec3("text.offset"); Vector3 greetSpacing = tm.GetVec3("text.spacing"); float greetScale = tm.GetFloat("text.scale"); group_greetings = new List <GreetPage>(); Vector3 monoGreetColor = tm.GetVec3("monolith_greets.color"); CreateGreets(tm, assetManager, "monolith_greets", greetFont, greet_material, monoGreetColor, greetShader , greetOffset, greetSpacing, greetScale , textStep, monolith.Transform, ref group_greetings); // Credits credits = new List <GreetPage>(); Vector3 creditsOffset = tm.GetVec3("credits.offset"); Vector3 creditsSpacing = tm.GetVec3("credits.spacing"); float creditsScale = tm.GetFloat("credits.scale"); Vector3 creditGreetColor = tm.GetVec3("credits.color"); CreateGreets(tm, assetManager, "credits", greetFont, greet_material, creditGreetColor, greetShader , creditsOffset, creditsSpacing, creditsScale , textStep, monolith.Transform, ref credits); textAlpha = syncSystem.GetTrack("text_A"); Logger.LogInfo("Creating title and name"); title = new List <GreetPage>(); GreetPage titlePage = new GreetPage(); titlePage.greets.Add(groupNameGreet); titlePage.greets.Add(demoNameGreet); title.Add(titlePage); if (settings.LightServer) { lightController.StartSync(); } Logger.LogPhase("Bunny demo is loaded"); syncSystem.PrintEditorRowAmount(); }