public static SyncSystem GetSingleton() { if (singleton == null) { singleton = new SyncSystem(); } return(singleton); }
public void Draw(Renderer renderer) { int s = SyncSystem.GetSingleton().Scene; if (s == mountainsNumber) { DrawStarSky(renderer); renderer.ActivateLight(mountainLight, 0); renderer.RenderMesh(mountains); DrawTelescope(renderer, mainTelescopePosition); DrawTelescopeArray(renderer); // Transparent things last! DrawGreets(renderer, title); } else if (s == moonNumber) { DrawStarSky(renderer); renderer.ActivateLight(mountainLight, 0); DrawMonolith(renderer); DrawGreets(renderer, group_greetings); } else if (s == bunnyNumber) { DrawStarSky(renderer); DrawLightMeshList(renderer, bunnyLights); DrawBunny(renderer); } else if (s == warpNumber) { DrawStarSky(renderer, true); DrawLightMeshList(renderer, bunnyLights); DrawBunny(renderer); } else if (s == seaNumber || s == crystalsNumber) { DrawPlanetSkybox(renderer); renderer.ActivateLight(planetLight, 0); renderer.RenderObject(planetMountains); DrawSea(renderer); DrawMonolith(renderer); DrawGreets(renderer, credits); } if (s == crystalsNumber) { DrawCrystals(renderer); } if (fadeAlpha > 0.0f) { DrawFadeout(renderer, fadeAlpha); } Error.checkGLError("BunnyDemo Draw"); }
public void SyncCameraFrame() { if (cameraFrames != null && !camera.FreeMode) { int frame = SyncSystem.GetSingleton().Frame; float frameProg = SyncSystem.GetSingleton().FrameProgress; camera.SetFrame(frame, frameProg, cameraFrames); } }
private void SyncSkybox(SyncSystem syncer) { // Rotate star sphere world matrix // Rotate lighting float rot = syncer.GetTrackValue(skyRotation) * MathHelper.TwoPi; starSkyBox.Transform.SetRotation(rot); mountainLight.Direction = new Vector3(new Vector4(0, 0, 1, 0) * starSkyBox.Transform.rotationTransformMatrix); }
private void SyncTelescope(Telescope scope, SyncSystem syncer) { float rotRad = MathHelper.DegreesToRadians(syncer.GetTrackValue(telescopeRotation)); scope.tower.Transform.SetRotation(rotRad); float elevRad = MathHelper.DegreesToRadians(syncer.GetTrackValue(telescopeElevation)); scope.antenna.Transform.SetRotation(elevRad); }
// SYNC FUNCTIONS private void SyncCamera(SyncSystem syncer) { Renderer renderer = Renderer.GetSingleton(); renderer.SyncCameraFrame(); CameraComponent camera = renderer.GetCamera(); camera.FOV = 90 + syncer.GetTrackValue(cameraFOV); camera.CreateMatrices(); }
// SYNC AND DRAW public void Sync(SyncSystem syncer) { SyncCamera(syncer); SyncFadeout(syncer); SyncSkybox(syncer); int s = syncer.Scene; if (s == mountainsNumber) { SyncTelescope(telescope, syncer); SyncGreets(syncer, title); lightController.syncing = false; } else if (s == moonNumber) { SyncMonolith(syncer); SyncGreets(syncer, group_greetings); lightController.syncing = false; } else if (s == bunnyNumber) { // Sync lights SyncBunny(syncer); SyncLightMeshList(bunnyLights, syncer.GetTrackValue(bunnyLightProgress)); lightController.syncing = true; lightController.SyncLightList(bunnyLights); } else if (s == warpNumber) { SyncBunny(syncer); SyncLightMeshList(bunnyLights, syncer.GetTrackValue(bunnyLightProgress)); lightController.syncing = true; lightController.SyncLightList(bunnyLights); } else if (s == seaNumber || s == crystalsNumber) { SyncMonolith(syncer); SyncGreets(syncer, credits); // Turn down lights SyncLightMeshList(bunnyLights, syncer.GetTrackValue(bunnyLightProgress)); lightController.syncing = true; lightController.SyncLightList(bunnyLights); } if (s == crystalsNumber) { lightController.syncing = false; // Crystals SyncCrystals(syncer); } }
void SyncCrystals(SyncSystem syncer) { for (int s = 0; s < crystalMeshes.Count; s++) { Vector4 ot = crystalMeshes[s].mesh.Transform.Translation; float t = syncer.SceneProgress * 18.0f; // about 18 seconds float a = crystalsGravity; float v0 = crystalMeshes[s].speed; float height = 0.0f + v0 * t + 0.5f * a * t * t; crystalMeshes[s].mesh.Transform.Translation = new Vector4(ot.X, height, ot.Z, 1.0f); crystalMeshes[s].mesh.Transform.SetRotation(syncer.SceneProgress * crystalMeshes[s].speed / 10.0f * MathHelper.TwoPi); } }
public void SyncGreets(SyncSystem syncer, List <GreetPage> greetPages) { float alphaPerPage = 1.0f / greetPages.Count; float wholeAlpha = syncer.GetTrackValue(textAlpha); for (int pi = 0; pi < greetPages.Count; pi++) { GreetPage p = greetPages[pi]; p.progress = DivideToPages(alphaPerPage, pi, wholeAlpha); float alphaPerGreet = 1.0f / p.greets.Count; for (int gi = 0; gi < p.greets.Count; gi++) { Greeting g = p.greets[gi]; g.alpha = DivideToItems(alphaPerGreet, gi, p.progress); } } }
public void SyncMonolith(SyncSystem syncer) { float rotations = syncer.GetTrackValue(monolithRotation); // Skip half of turn so that it seems that text is on both sides // 0.0 is facing camera // Pi. is 180d // start is -90 while (rotations > 1.0f) { rotations -= 1.0f; } monolith.Transform.SetRotation(rotations * MathHelper.Pi - MathHelper.PiOver2); Vector3 monoPos = monolith.Transform.GetWorldPosition(); monolith.Transform.Translation = new Vector4(monoPos.X, syncer.GetTrackValue(monolithElevation), monoPos.Z, 1.0f); }
private void DrawStarSky(Renderer renderer, bool warp = false) { renderer.SetActiveSkybox(starSkyboxMaterial); renderer.SetSkyboxRotation(starSkyBox.Transform.CreateRotationMatrixFromAxisAngle()); if (warp) { CameraComponent cam = renderer.GetCamera(); float prevFOV = cam.FOV; cam.FOV = 90 + SyncSystem.GetSingleton().GetTrackValue(warpFOV); cam.CreateMatrices(); renderer.RenderSky(starSkyBox); cam.FOV = prevFOV; cam.CreateMatrices(); } else { renderer.RenderSky(starSkyBox); } }
protected override void OnLoad(EventArgs e) { PauseSyncButton = new Button(Key.Space); PrevSceneButton = new Button(Key.F3); NextSceneButton = new Button(Key.F4); ReloadDemoButton = new Button(Key.F5); RestartDemoOrRetreatSceneButton = new Button(Key.F6); AdvanceSceneButton = new Button(Key.F7); InputEnabledButton = new Button(Key.F8); CameraModeButton = new Button(Key.F9); CameraSpeedDownButton = new Button(Key.F10); CameraSpeedUpButton = new Button(Key.F11); PrintFrameButton = new Button(Key.F12); tunableManager = TunableManager.GetSingleton(); syncSystem = SyncSystem.GetSingleton(); renderer = Renderer.GetSingleton(); string dataFolder = "data"; AssetManager.WorkingDir = dataFolder; AssetManager assetManager = AssetManager.GetSingleton(); Logger.LogPhase("Asset manager is created"); assetManager.LoadAll(); assetManager.printLoadedAssets(); Logger.LogPhase("Assets have been loaded"); tunableManager.ReloadValues(); Logger.LogPhase("Config file have been loaded"); demoWrapper = new DemoWrapper(); demoWrapper.Create(); demoSettings = demoWrapper.Demo.GetDemoSettings(); // Audio .................................... Logger.LogPhase("Initializing audio system"); if (demoSettings.AudioEngineSetting == DemoSettings.AudioEngine.System) { audioSystem = new SystemAudio(); } if (demoSettings.AudioEngineSetting == DemoSettings.AudioEngine.Dummy) { if (demoSettings.AudioEnabled == true) { Logger.LogError(Logger.ErrorState.User, "Initialized dummy audio when Audio is enabled."); } audioSystem = new DummyAudioSystem(); } bool audioInitOk = audioSystem.Initialize(); if (!audioInitOk) { Logger.LogError(Logger.ErrorState.Critical, "Audio system failed to initialize."); return; } Logger.LogPhase("Audio has been initialized"); demoWrapper.SetAudioSystem(audioSystem); // Sync............................. if (demoSettings.SyncEnabled) { syncSystem.Start(demoSettings.SyncFilePrefix); } else { syncSystem.StartManual(); } // Rendering ................. Size windowSize = new Size((int)demoSettings.Resolution.X, (int)demoSettings.Resolution.Y); base.Size = windowSize; if (demoSettings.Fullscreen) { base.WindowState = WindowState.Fullscreen; } renderer.ResizeScreen((int)demoSettings.Resolution.X, (int)demoSettings.Resolution.Y); CursorVisible = false; testScene = new TestScene(); testScene.Load(assetManager); loadingScene = new LoadingScene(); loadingScene.Load(assetManager); applicationTime = new Stopwatch(); LoadDemo(); Logger.LogPhase("OnLoad complete"); loadCompleted = true; running = true; applicationTime.Start(); }
void SyncBunny(SyncSystem syncer) { bunnyMesh.Transform.SetRotation(syncer.GetTrackValue(bunnyRotation) * MathHelper.Pi); }
private void SyncFadeout(SyncSystem syncer) { fadeAlpha = syncer.GetTrackValue(fadeoutAlpha); }
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(); }