Exemple #1
0
        /// <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");
        }
Exemple #2
0
 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);
 }
Exemple #3
0
        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);
        }
Exemple #4
0
        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);
        }
Exemple #8
0
        /// <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);
        }
Exemple #9
0
        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?
        }
Exemple #10
0
        /// <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);
        }
Exemple #11
0
 // 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>();
 }