/// <summary> /// Builds or rebuilds the the light sources for the world. /// TODO: Call this whenenver render distance changes! /// </summary> public void BuildLightsForWorld() { if (TheSun != null) { TheSun.Destroy(); MainWorldView.Lights.Remove(TheSun); TheSunClouds.Destroy(); MainWorldView.Lights.Remove(TheSunClouds); ThePlanet.Destroy(); MainWorldView.Lights.Remove(ThePlanet); } View3D.CheckError("Load - World - Deletes"); int wid = CVars.r_shadowquality.ValueI; TheSun = new SkyLight(Location.Zero, MaximumStraightBlockDistance() * 2, SunLightDef, new Location(0, 0, -1), MaximumStraightBlockDistance() * 2 + Chunk.CHUNK_SIZE * 2, false, wid); MainWorldView.Lights.Add(TheSun); View3D.CheckError("Load - World - Sun"); // TODO: Separate cloud quality CVar? TheSunClouds = new SkyLight(Location.Zero, MaximumStraightBlockDistance() * 2, CloudSunLightDef, new Location(0, 0, -1), MaximumStraightBlockDistance() * 2 + Chunk.CHUNK_SIZE * 2, true, wid); MainWorldView.Lights.Add(TheSunClouds); View3D.CheckError("Load - World - Clouds"); // TODO: Separate planet quality CVar? ThePlanet = new SkyLight(Location.Zero, MaximumStraightBlockDistance() * 2, PlanetLightDef, new Location(0, 0, -1), MaximumStraightBlockDistance() * 2 + Chunk.CHUNK_SIZE * 2, false, wid); MainWorldView.Lights.Add(ThePlanet); View3D.CheckError("Load - World - Planet"); OnCloudShadowChanged(null, null); View3D.CheckError("Load - World - Changed"); }
public void BuildWorld() { if (TheSun != null) { TheSun.Destroy(); MainWorldView.Lights.Remove(TheSun); ThePlanet.Destroy(); MainWorldView.Lights.Remove(ThePlanet); TheSunClouds.Destroy(); MainWorldView.Lights.Remove(TheSunClouds); } // TODO: DESTROY OLD REGION! // TODO: Radius -> max view rad * 2 // TODO: Size -> max view rad * 2 + 30 * 2 TheSun = new SkyLight(Location.Zero, Chunk.CHUNK_SIZE * 30, SunLightDef, new Location(0, 0, -1), Chunk.CHUNK_SIZE * 35, false); MainWorldView.Lights.Add(TheSun); // TODO: Separate cloud quality CVar? TheSunClouds = new SkyLight(Location.Zero, Chunk.CHUNK_SIZE * 30, CloudSunLightDef, new Location(0, 0, -1), Chunk.CHUNK_SIZE * 35, true); MainWorldView.Lights.Add(TheSunClouds); // TODO: Separate planet quality CVar? ThePlanet = new SkyLight(Location.Zero, Chunk.CHUNK_SIZE * 30, PlanetLightDef, new Location(0, 0, -1), Chunk.CHUNK_SIZE * 35, false); MainWorldView.Lights.Add(ThePlanet); TheRegion = new Region(); TheRegion.TheClient = this; TheRegion.BuildWorld(); Player = new PlayerEntity(TheRegion); TheRegion.SpawnEntity(Player); onCloudShadowChanged(null, null); }
public NbtTag Serialize(string tagName) { var chunk = new NbtCompound(tagName); var entities = new NbtList("Entities", NbtTagType.Compound); chunk.Add(entities); chunk.Add(new NbtInt("X", X)); chunk.Add(new NbtInt("Z", Z)); chunk.Add(new NbtByte("LightPopulated", (byte)(LightPopulated ? 1 : 0))); chunk.Add(new NbtByte("TerrainPopulated", (byte)(TerrainPopulated ? 1 : 0))); chunk.Add(new NbtByteArray("Blocks", Data)); chunk.Add(new NbtByteArray("Data", Metadata.ToArray())); chunk.Add(new NbtByteArray("SkyLight", SkyLight.ToArray())); chunk.Add(new NbtByteArray("BlockLight", BlockLight.ToArray())); var tiles = new NbtList("TileEntities", NbtTagType.Compound); foreach (var kvp in TileEntities) { var c = new NbtCompound(); c.Add(new NbtList("coordinates", new[] { new NbtInt(kvp.Key.X), new NbtInt(kvp.Key.Y), new NbtInt(kvp.Key.Z) })); c.Add(new NbtList("value", new[] { kvp.Value })); tiles.Add(c); } chunk.Add(tiles); // TODO: Entities return(chunk); }
public SkyLight CreateSkyLight(Dictionary <string, Texture> textures) { var assembly = typeof(SkyLight).Assembly; var types = assembly.GetTypes(); MethodInfo createMethod = null; for (int i = 0; i < types.Length; i++) { if (types[i].IsAbstract || !types[i].IsSubclassOf(typeof(SkyLight))) { continue; } var attributes = types[i].GetCustomAttributes(typeof(SkyLightTypeAttribute), true); if (attributes != null && attributes.Length > 0) { var shaderAttribute = attributes[0] as SkyLightTypeAttribute; if (shaderAttribute != null && shaderAttribute.skyLightType == shaderType) { var method = types[i].GetMethod("Create", BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static); if (method != null) { createMethod = method; break; } } } } if (createMethod == null) { return(null); } SkyLight sky = createMethod.Invoke(null, new object[] { }) as SkyLight; if (sky == null) { return(null); } if (shaderParams != null) { for (int i = 0; i < shaderParams.Count; i++) { SceneSerialization.SetParameterToObject(sky, shaderParams[i].paramName, shaderParams[i].paramValue, textures); } } Log.Info($"天空盒创建成功:{sky.GetType()}"); return(sky); }
/// <summary> /// Fired when the entity is spawned. /// </summary> public override void OnSpawn() { if (Entity.Engine is GameEngine3D eng) { InternalLight = new SkyLight(LightPosition, Radius, LightColor, Direction, Size, false, Engine3D.MainView.ShadowTexSize()); eng.MainView.Lights.Add(InternalLight); Entity.OnPositionChanged += FixPosition; Entity.OnTick += Tick; } else { SysConsole.Output(OutputType.WARNING, "3D light spawned into a non-3D-engine-based game!"); } }
/// <summary> /// Fired when the entity is despawned. /// </summary> public override void OnDespawn() { if (Entity.Engine is GameEngine3D eng) { eng.MainView.Lights.Remove(InternalLight); InternalLight.Destroy(); InternalLight = null; Entity.OnPositionChanged -= FixPosition; Entity.OnTick -= Tick; } else { SysConsole.Output(OutputType.WARNING, "3D light despawned from a non-3D-engine-based game!"); } }
public void FixInvRender() { MainItemView.Render3D = RenderMainItem; foreach (LightObject light in MainItemView.Lights) { foreach (Light li in light.InternalLights) { li.Destroy(); } } MainItemView.Lights.Clear(); MainItemView.RenderClearAlpha = 0f; SkyLight tlight = new SkyLight(new Location(0, 0, 10), 64, Location.One, new Location(0, -1, -1).Normalize(), 64, false); MainItemView.Lights.Add(tlight); MainItemView.GenerateFBO(); MainItemView.Generate(this, Window.Width, Window.Height); }
/// <summary> /// Initializes a new instance of the <see cref="AssetPreview"/> class. /// </summary> /// <param name="useWidgets">if set to <c>true</c> use widgets.</param> public AssetPreview(bool useWidgets) : base(RenderTask.Create <SceneRenderTask>(), new ArcBallCamera(Vector3.Zero, 50), useWidgets) { DockStyle = DockStyle.Fill; Task.Flags = ViewFlags.DefaulAssetPreview; Task.AllowGlobalCustomPostFx = false; ((ArcBallCamera)ViewportCamera).SetView(new Quaternion(0.424461186f, -0.0940724313f, 0.0443938486f, 0.899451137f)); // Setup preview scene PreviewLight = DirectionalLight.New(); PreviewLight.Brightness = 6.0f; PreviewLight.ShadowsMode = ShadowsCastingMode.None; PreviewLight.Orientation = Quaternion.Euler(new Vector3(52.1477f, -109.109f, -111.739f)); // EnvProbe = EnvironmentProbe.New(); EnvProbe.AutoUpdate = false; EnvProbe.CustomProbe = FlaxEngine.Content.LoadAsyncInternal <CubeTexture>(EditorAssets.DefaultSkyCubeTexture); // Sky = Sky.New(); Sky.SunLight = PreviewLight; Sky.SunPower = 8.0f; // SkyLight = SkyLight.New(); SkyLight.Mode = SkyLight.Modes.CustomTexture; SkyLight.Brightness = 2.0f; SkyLight.CustomTexture = EnvProbe.CustomProbe; // PostFxVolume = PostFxVolume.New(); PostFxVolume.IsBounded = false; PostFxVolume.Settings.Eye_MinLuminance = 0.1f; // Link actors for rendering Task.ActorsSource = ActorsSources.CustomActors; Task.CustomActors.Add(PreviewLight); Task.CustomActors.Add(EnvProbe); Task.CustomActors.Add(Sky); Task.CustomActors.Add(SkyLight); Task.CustomActors.Add(PostFxVolume); }
public void FixInvRender() { MainItemView.Render3D = RenderMainItem; foreach (LightObject light in MainItemView.Lights) { foreach (Light li in light.InternalLights) { li.Destroy(); } } MainItemView.FastOnly = true; MainItemView.Lights.Clear(); MainItemView.RenderClearAlpha = 0f; SkyLight tlight = new SkyLight(new Location(0, 0, 10), 64, Location.One, new Location(0, -1, -1).Normalize(), 64, false, 64); MainItemView.Lights.Add(tlight); MainItemView.Width = Window.Width; MainItemView.Height = Window.Height; MainItemView.GenerateFBO(); MainItemView.Generate(this, Window.Width, Window.Height); // TODO: Change Width/Height here and above to actual viewed size? }
/// <summary> /// Creates the new scene file. The default scene contains set of simple actors. /// </summary> /// <param name="path">The path.</param> public void CreateSceneFile(string path) { // Create a sample scene var scene = Scene.New(); var sky = Sky.New(); var sun = DirectionalLight.New(); var skyLight = SkyLight.New(); var floor = StaticModel.New(); var cam = Camera.New(); // scene.StaticFlags = StaticFlags.FullyStatic; scene.AddChild(sky); scene.AddChild(sun); scene.AddChild(skyLight); scene.AddChild(floor); scene.AddChild(cam); // sky.Name = "Sky"; sky.LocalPosition = new Vector3(40, 150, 0); sky.SunLight = sun; sky.StaticFlags = StaticFlags.FullyStatic; // sun.Name = "Sun"; sun.Brightness = 4.0f; sun.LocalPosition = new Vector3(40, 160, 0); sun.LocalEulerAngles = new Vector3(45, 0, 0); sun.StaticFlags = StaticFlags.FullyStatic; // skyLight.Mode = SkyLight.Modes.CustomTexture; skyLight.Brightness = 1.8f; skyLight.CustomTexture = FlaxEngine.Content.LoadAsyncInternal <CubeTexture>(EditorAssets.DefaultSkyCubeTexture); skyLight.StaticFlags = StaticFlags.FullyStatic; // floor.Name = "Floor"; floor.Scale = new Vector3(4, 0.5f, 4); floor.Model = FlaxEngine.Content.LoadAsync <Model>(StringUtils.CombinePaths(Globals.EditorFolder, "Primitives/Cube.flax")); if (floor.Model) { floor.Model.WaitForLoaded(); floor.Entries[0].Material = FlaxEngine.Content.LoadAsync <MaterialBase>(StringUtils.CombinePaths(Globals.EngineFolder, "WhiteMaterial.flax")); } floor.StaticFlags = StaticFlags.FullyStatic; // cam.Name = "Camera"; cam.Position = new Vector3(0, 150, -300); // Serialize var bytes = SceneManager.SaveSceneToBytes(scene); // Cleanup Object.Destroy(ref scene); if (bytes == null || bytes.Length == 0) { throw new Exception("Failed to serialize scene."); } // Write to file using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read)) fileStream.Write(bytes, 0, bytes.Length); }
// Use this for initialization void Start() { skylight = FindObjectsOfType <Terrain>()[0].GetComponent <SkyLight>(); }
// Use this for initialization void Start() { parentBuilding = gameObject.transform.parent.GetComponent <BuildingBehavior>(); skylight = FindObjectsOfType <Terrain>()[0].GetComponent <SkyLight>(); }