Example #1
0
        /// <summary>
        /// インスタンスを生成します。
        /// </summary>
        /// <param name="manager">チャンク マネージャ。</param>
        public ChunkData(ChunkManager manager)
        {
            if (manager == null) throw new ArgumentNullException("manager");

            this.manager = manager;

            blockIndices = new byte[manager.ChunkSize.X * manager.ChunkSize.Y * manager.ChunkSize.Z];
        }
Example #2
0
        public LocalWorld(ChunkManager manager, IntVector3 size)
        {
            if (manager == null) throw new ArgumentNullException("manager");
            if (size.X < 1 || size.Y < 1 || size.Z < 1) throw new ArgumentOutOfRangeException("size");

            this.manager = manager;
            Size = size;

            chunks = new Chunk[size.X, size.Y, size.Z];
        }
Example #3
0
        /// <summary>
        /// インスタンスを生成します。
        /// </summary>
        /// <param name="chunkManager">チャンク マネージャ。</param>
        /// <param name="position">チャンクの位置。</param>
        /// <param name="region">リージョン。</param>
        public Chunk(ChunkManager chunkManager, ChunkMeshManager meshManager, Region region, IntVector3 position)
        {
            if (chunkManager == null) throw new ArgumentNullException("manager");
            if (region == null) throw new ArgumentNullException("region");

            this.chunkManager = chunkManager;
            this.meshManager = meshManager;
            this.region = region;
            Position = position;

            opaqueMeshes = new ChunkMesh[meshManager.MeshSegments.X, meshManager.MeshSegments.Y, meshManager.MeshSegments.Z];
            translucentMeshes = new ChunkMesh[meshManager.MeshSegments.X, meshManager.MeshSegments.Y, meshManager.MeshSegments.Z];

            Node = chunkManager.CreateNode();
        }
        public ChunkMeshManager(ChunkManager chunkManager, int concurrencyLevel, int updateBufferCountPerFrame)
        {
            if (chunkManager == null)
            {
                throw new ArgumentNullException("chunkManager");
            }

            this.chunkManager              = chunkManager;
            this.concurrencyLevel          = concurrencyLevel;
            this.updateBufferCountPerFrame = updateBufferCountPerFrame;

            buildVertexRequestPool = new ConcurrentPool <BuildVertexRequest>(() => { return(new BuildVertexRequest()); });
            buildVertexRequests    = new ConcurrentPriorityQueue <BuildVertexRequest>(new BuildVertexRequestComparer());
            updateBufferRequests   = new ConcurrentPriorityQueue <UpdateBufferRequest>(new UpdateBufferRequestComparer());
            vertexBuilderPool      = new ConcurrentPool <ChunkVertexBuilder>(() => { return(new ChunkVertexBuilder(this)); })
            {
                MaxCapacity = concurrencyLevel
            };
            buildVertexTask = new BuildVertexTask(this, OnBuildVertexTaskCallback);

            ChunkSize = chunkManager.ChunkSize;

            MeshSegments = new IntVector3
            {
                X = ChunkSize.X / MeshSize.X,
                Y = ChunkSize.Y / MeshSize.Y,
                Z = ChunkSize.Z / MeshSize.Z
            };

            var halfMeshSize = MeshSize;

            halfMeshSize.X /= 2;
            halfMeshSize.Y /= 2;
            halfMeshSize.Z /= 2;
            MeshOffset      = halfMeshSize.ToVector3();
        }
Example #5
0
        public void Initialize()
        {
            //----------------------------------------------------------------
            // グラフィックス設定

            GraphicsSettings = LoadAsset <GraphicsSettings>("title:Resources/GraphicsSettings.json");

            //----------------------------------------------------------------
            // シーン設定

            // TODO: ワールド設定としてどうするか再検討。
            // いずれにせよ、SceneSettings はワールド設定と一対一。

            SceneSettings = LoadAsset <SceneSettings>("title:Resources/SceneSettings.json");

            //----------------------------------------------------------------
            // シーン マネージャ設定

            // TODO: リソースから取得する。
            SceneManagerSettings = new SceneManager.Settings();

            //----------------------------------------------------------------
            // シーン マネージャ

            SceneManager = new SceneManager(SceneManagerSettings, GraphicsDevice);

            // 太陽と月をディレクショナル ライトとして登録。
            SceneManager.DirectionalLights.Add(SceneSettings.Sunlight);
            SceneManager.DirectionalLights.Add(SceneSettings.Moonlight);

            // シャドウ マップ
            if (GraphicsSettings.ShadowMapEnabled)
            {
                var shadowMapEffect = LoadAsset <Effect>("content:Effects/ShadowMap");
                var blurEffect      = LoadAsset <Effect>("content:Effects/GaussianBlur");

                ShadowMap = new ShadowMap(GraphicsDevice, GraphicsSettings.ShadowMap, spriteBatch, shadowMapEffect, blurEffect);

                SceneManager.ShadowMap = ShadowMap;
            }

            // レンズ フレア
            if (GraphicsSettings.LensFlareEnabled)
            {
                var         glowSpite    = LoadAsset <Texture2D>("content:Textures/LensFlare/Glow");
                Texture2D[] flareSprites =
                {
                    LoadAsset <Texture2D>("content:Textures/LensFlare/Flare1"),
                    LoadAsset <Texture2D>("content:Textures/LensFlare/Flare2"),
                    LoadAsset <Texture2D>("content:Textures/LensFlare/Flare3")
                };

                LensFlare = new LensFlare(GraphicsDevice, spriteBatch, glowSpite, flareSprites);

                SceneManager.LensFlare = LensFlare;
            }

            // スクリーン スペース シャドウ マッピング
            if (GraphicsSettings.SssmEnabled)
            {
                // スクリーン スペース シャドウ マッピング モジュール
                var shadowSceneEffect = LoadAsset <Effect>("content:Effects/ShadowScene");
                var sssmEffect        = LoadAsset <Effect>("content:Effects/Sssm");
                var blurEffect        = LoadAsset <Effect>("content:Effects/GaussianBlur");

                Sssm             = new Sssm(spriteBatch, GraphicsSettings.ShadowMap, GraphicsSettings.Sssm, shadowSceneEffect, sssmEffect, blurEffect);
                Sssm.ShadowColor = SceneSettings.ShadowColor;

                SceneManager.PostProcessors.Add(Sssm);

                // SSSM は直接的なシャドウ描画を回避しなければならないため明示。
                SceneManager.SssmEnabled = true;
            }

            // スクリーン スペース アンビエント オクルージョン
            if (GraphicsSettings.SsaoEnabled)
            {
                var normalDepthMapEffect = LoadAsset <Effect>("content:Effects/NormalDepthMap");
                var ssaoMapEffect        = LoadAsset <Effect>("content:Effects/SsaoMap");
                var blurEffect           = LoadAsset <Effect>("content:Effects/SsaoMapBlur");
                var ssaoEffect           = LoadAsset <Effect>("content:Effects/Ssao");
                var randomNormalMap      = LoadAsset <Texture2D>("content:Textures/RandomNormal");

                Ssao = new Ssao(spriteBatch, GraphicsSettings.Ssao,
                                normalDepthMapEffect, ssaoMapEffect, blurEffect, ssaoEffect, randomNormalMap);

                SceneManager.PostProcessors.Add(Ssao);
            }

            // エッジ強調
            if (GraphicsSettings.EdgeEnabled)
            {
                var normalDepthMapEffect = LoadAsset <Effect>("content:Effects/NormalDepthMap");
                var edgeEffect           = LoadAsset <Effect>("content:Effects/Edge");

                Edge = new Edge(spriteBatch, GraphicsSettings.Edge, normalDepthMapEffect, edgeEffect);

                SceneManager.PostProcessors.Add(Edge);
            }

            // ブルーム
            if (GraphicsSettings.BloomEnabled)
            {
                var bloomExtractEffect = LoadAsset <Effect>("content:Effects/BloomExtract");
                var bloomEffect        = LoadAsset <Effect>("content:Effects/Bloom");
                var blurEffect         = LoadAsset <Effect>("content:Effects/GaussianBlur");

                Bloom = new Bloom(spriteBatch, GraphicsSettings.Bloom, bloomExtractEffect, bloomEffect, blurEffect);

                SceneManager.PostProcessors.Add(Bloom);
            }

            // 被写界深度
            if (GraphicsSettings.DofEnabled)
            {
                var depthMapEffect = LoadAsset <Effect>("content:Effects/DepthMap");
                var dofEffect      = LoadAsset <Effect>("content:Effects/Dof");
                var blurEffect     = LoadAsset <Effect>("content:Effects/GaussianBlur");

                Dof = new Dof(spriteBatch, GraphicsSettings.Dof, depthMapEffect, dofEffect, blurEffect);

                SceneManager.PostProcessors.Add(Dof);
            }

            // カラー オーバラップ
            if (GraphicsSettings.ColorOverlapEnabled)
            {
                ColorOverlap = new ColorOverlap(spriteBatch);

                SceneManager.PostProcessors.Add(ColorOverlap);
            }

            // モノクローム
            if (GraphicsSettings.MonochromeEnabled)
            {
                var monochromeEffect = LoadAsset <Effect>("content:Effects/Monochrome");

                Monochrome = new Monochrome(spriteBatch, monochromeEffect);

                SceneManager.PostProcessors.Add(Monochrome);
            }

            // 走査線
            if (GraphicsSettings.ScanlineEnabled)
            {
                var effect = LoadAsset <Effect>("content:Effects/Scanline");

                Scanline = new Scanline(spriteBatch, effect);

                SceneManager.PostProcessors.Add(Scanline);
            }

            //----------------------------------------------------------------
            // リージョン マネージャ

            RegionManager = new RegionManager(serviceProvider, SceneManager);
            RegionManager.Initialize(SceneSettings);

            // イベント ハンドラ
            // シャドウ マップ更新にあわせて、リージョン マネージャで管理しているエフェクトを準備する。
            SceneManager.ShadowMapUpdated += RegionManager.OnShadowMapUpdated;

            //----------------------------------------------------------------
            // チャンク マネージャ

            var chunkSettings = LoadAsset <ChunkSettings>("title:Resources/ChunkSettings.json");

            ChunkManager = new ChunkManager(chunkSettings, GraphicsDevice, RegionManager, SceneManager);

            //----------------------------------------------------------------
            // デフォルト カメラ

            //camera.View.Position = new Vector3(0, 16 * 18, 0);
            defaultCamera.View.Position = new Vector3(0, 16 * 16, 0);
            //camera.View.Position = new Vector3(0, 16 * 3, 0);
            //camera.View.Position = new Vector3(0, 16 * 2, 0);
            //defaultCamera.Projection.Fov = MathHelper.ToRadians(90);
            defaultCamera.Projection.AspectRatio = GraphicsDevice.Viewport.AspectRatio;

            // 最大アクティブ範囲を超えない位置へ FarPlaneDistance を設定。
            // パーティション (チャンク) のサイズを掛けておく。

            var minChunkSize = Math.Min(chunkSettings.ChunkSize.X, chunkSettings.ChunkSize.Y);

            minChunkSize = Math.Min(minChunkSize, chunkSettings.ChunkSize.Z);
            defaultCamera.Projection.FarPlaneDistance = (chunkSettings.MaxActiveVolume - 1) * minChunkSize;

            // 念のためここで一度更新。
            defaultCamera.Update();

            // シーン マネージャへ登録してアクティブ化。
            SceneManager.Cameras.Add(defaultCamera);
            SceneManager.ActiveCameraName = defaultCamera.Name;
        }