public OCTerrainGenerator(OpenCog.Map.OCMap map) {
		this.map = map;
		Debug.Log("OCTerrainGenerator is getting the BlockSet from the Map.");
		OpenCog.BlockSet.OCBlockSet blockSet = map.GetBlockSet();
		Debug.Log("BlockSet retrieved...");
		
		water = blockSet.GetBlock("Water");

		grass = blockSet.GetBlock("Grass");

		if (grass == null)
		{
			Debug.Log("We have no Grass! :(");

			for (int i = 0; i < blockSet.Blocks.Length; i++)
			{
				Debug.Log("But we have " + blockSet.Blocks[i].GetName());

			}
		}
		dirt = blockSet.GetBlock("Dirt");
		sand = blockSet.GetBlock("Sand");
		stone = blockSet.GetBlock("Stone");
		
		snow = blockSet.GetBlock("Snow");
		ice = blockSet.GetBlock("Ice");
	}
        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Accessors and Mutators

        //---------------------------------------------------------------------------



        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Public Member Functions

        //---------------------------------------------------------------------------

        public void Awake()
        {
            OpenCog.Map.OCMap map = (OpenCog.Map.OCMap)GameObject.FindObjectOfType(typeof(OpenCog.Map.OCMap));
            _blockSet = map.GetBlockSet();
            _player   = GameObject.FindGameObjectWithTag("Player");
            _builder  = (OpenCog.Builder.OCBuilder)_player.GetComponent <OpenCog.Builder.OCBuilder>();
        }
예제 #3
0
        //---------------------------------------------------------------------------

        #region Private Member Data

        //---------------------------------------------------------------------------



        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Accessors and Mutators

        //---------------------------------------------------------------------------



        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Public Member Functions

        //---------------------------------------------------------------------------

        public static void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight)
        {
            if (!onlyLight)
            {
                BuildCross((Vector3)localPos, worldPos, map, mesh);
            }
            BuildCrossLight(map, worldPos, mesh);
        }
예제 #4
0
        public static UnityEngine.Color GetBlockLight(OpenCog.Map.OCMap map, Vector3i pos)
        {
            Vector3i chunkPos = OpenCog.Map.OCChunk.ToChunkPosition(pos);
            Vector3i localPos = OpenCog.Map.OCChunk.ToLocalPosition(pos);
            float    light    = (float)map.GetLightmap().GetLight(chunkPos, localPos) / OpenCog.Map.Lighting.OCSunLightComputer.MAX_LIGHT;
            float    sun      = (float)map.GetSunLightmap().GetLight(chunkPos, localPos, pos.y) / OpenCog.Map.Lighting.OCSunLightComputer.MAX_LIGHT;

            return(new UnityEngine.Color(light, light, light, sun));
        }
예제 #5
0
        private static void BuildCross(Vector3 localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh)
        {
            OCCrossBlock cross = (OCCrossBlock)map.GetBlock(worldPos).block;

            mesh.AddIndices(cross.AtlasID, indices);
            mesh.AddVertices(vertices, localPos);
            mesh.AddNormals(normals);
            mesh.AddTexCoords(cross.GetFaceUV());
            mesh.AddTexCoords(cross.GetFaceUV());
            mesh.AddTexCoords(cross.GetFaceUV());
            mesh.AddTexCoords(cross.GetFaceUV());
        }
예제 #6
0
        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Private Member Functions

        //---------------------------------------------------------------------------

        private static bool IsFaceVisible(OpenCog.Map.OCMap map, Vector3i nearPos, OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face)
        {
            if (face == OCCubeBlock.CubeFace.Top)
            {
                OpenCog.Map.OCBlockData block = map.GetBlock(nearPos);
                return(block.IsEmpty() || !block.IsFluid());
            }
            else
            {
                return(map.GetBlock(nearPos).IsEmpty());
            }
        }
예제 #7
0
        public static UnityEngine.Color GetSmoothVertexLight(OpenCog.Map.OCMap map, Vector3i pos, UnityEngine.Vector3 vertex, OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face)
        {
            // pos - позиция блока
            // vertex позиция вершины относительно блока т.е. от -0.5 до 0.5
            int dx = (int)Mathf.Sign(vertex.x);
            int dy = (int)Mathf.Sign(vertex.y);
            int dz = (int)Mathf.Sign(vertex.z);

            Vector3i a, b, c, d;

            if (face == OCCubeBlock.CubeFace.Left || face == OCCubeBlock.CubeFace.Right)      // X
            {
                a = pos + new Vector3i(dx, 0, 0);
                b = pos + new Vector3i(dx, dy, 0);
                c = pos + new Vector3i(dx, 0, dz);
                d = pos + new Vector3i(dx, dy, dz);
            }
            else
            if (face == OCCubeBlock.CubeFace.Bottom || face == OCCubeBlock.CubeFace.Top)      // Y
            {
                a = pos + new Vector3i(0, dy, 0);
                b = pos + new Vector3i(dx, dy, 0);
                c = pos + new Vector3i(0, dy, dz);
                d = pos + new Vector3i(dx, dy, dz);
            }
            else         // Z
            {
                a = pos + new Vector3i(0, 0, dz);
                b = pos + new Vector3i(dx, 0, dz);
                c = pos + new Vector3i(0, dy, dz);
                d = pos + new Vector3i(dx, dy, dz);
            }

            if (map.GetBlock(b).IsAlpha() || map.GetBlock(c).IsAlpha())
            {
                Color c1 = GetBlockLight(map, a);
                Color c2 = GetBlockLight(map, b);
                Color c3 = GetBlockLight(map, c);
                Color c4 = GetBlockLight(map, d);
                return((c1 + c2 + c3 + c4) / 4f);
            }
            else
            {
                Color c1 = GetBlockLight(map, a);
                Color c2 = GetBlockLight(map, b);
                Color c3 = GetBlockLight(map, c);
                return((c1 + c2 + c3) / 3f);
            }
        }
예제 #8
0
		public OCChunk(OCMap map, Vector3i position) {
			this.map = map;
			this.position = position;
			for(int x=blocks.GetMinX(); x < blocks.GetMaxX(); ++x)
			{
				for(int y=blocks.GetMinY(); y < blocks.GetMaxY(); ++y)
				{
					for(int z=blocks.GetMinZ (); z < blocks.GetMaxZ (); ++z)
					{
						Vector3i pos = new Vector3i(x, y, z);
						blocks.Set(OCBlockData.CreateInstance<OCBlockData>().Init(null,pos), pos);
					}
				}
			}
		}
예제 #9
0
 public OCChunk(OCMap map, Vector3i position)
 {
     this.map      = map;
     this.position = position;
     for (int x = blocks.GetMinX(); x < blocks.GetMaxX(); ++x)
     {
         for (int y = blocks.GetMinY(); y < blocks.GetMaxY(); ++y)
         {
             for (int z = blocks.GetMinZ(); z < blocks.GetMaxZ(); ++z)
             {
                 Vector3i pos = new Vector3i(x, y, z);
                 blocks.Set(OCBlockData.CreateInstance <OCBlockData>().Init(null, pos), pos);
             }
         }
     }
 }
예제 #10
0
 private static bool IsFaceVisible(OpenCog.Map.OCMap map, OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face, Vector3i nearPos)
 {
     if (face == OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace.Bottom || face == OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace.Top)
     {
         OCBlock block = map.GetBlock(nearPos).block;
         if (block is OCCubeBlock && !block.IsAlpha())
         {
             return(false);
         }
         if (block is OCCactusBlock)
         {
             return(false);
         }
     }
     return(true);
 }
예제 #11
0
 private static UnityEngine.Color ComputeSmoothLight(OpenCog.Map.OCMap map, Vector3i a, Vector3i b, Vector3i c, Vector3i d)
 {
     if (map.GetBlock(b).IsAlpha() || map.GetBlock(c).IsAlpha())
     {
         UnityEngine.Color c1 = GetBlockLight(map, a);
         UnityEngine.Color c2 = GetBlockLight(map, b);
         UnityEngine.Color c3 = GetBlockLight(map, c);
         UnityEngine.Color c4 = GetBlockLight(map, d);
         return((c1 + c2 + c3 + c4) / 4f);
     }
     else
     {
         UnityEngine.Color c1 = GetBlockLight(map, a);
         UnityEngine.Color c2 = GetBlockLight(map, b);
         UnityEngine.Color c3 = GetBlockLight(map, c);
         return((c1 + c2 + c3) / 3f);
     }
 }
예제 #12
0
        public static OCChunkRenderer CreateChunkRenderer(Vector3i pos, OpenCog.Map.OCMap map, OCChunk chunk)
        {
            UnityEngine.GameObject go = new UnityEngine.GameObject("(" + pos.x + " " + pos.y + " " + pos.z + ")", typeof(UnityEngine.MeshFilter), typeof(UnityEngine.MeshRenderer), typeof(OpenCog.Map.OCChunkRenderer));
            go.transform.parent        = map.transform;
            go.transform.localPosition = new UnityEngine.Vector3(pos.x * OpenCog.Map.OCChunk.SIZE_X, pos.y * OpenCog.Map.OCChunk.SIZE_Y, pos.z * OpenCog.Map.OCChunk.SIZE_Z);
            go.transform.localRotation = UnityEngine.Quaternion.identity;
            go.transform.localScale    = UnityEngine.Vector3.one;

            OCChunkRenderer chunkRenderer = go.GetComponent <OCChunkRenderer>();

            chunkRenderer.BlockSet = map.GetBlockSet();
            chunkRenderer.Chunk    = chunk;

            go.renderer.castShadows    = false;
            go.renderer.receiveShadows = false;

            return(chunkRenderer);
        }
예제 #13
0
        //---------------------------------------------------------------------------

        #region Private Member Data

        //---------------------------------------------------------------------------



        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Accessors and Mutators

        //---------------------------------------------------------------------------



        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Public Member Functions

        //---------------------------------------------------------------------------

        public static void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight)
        {
            OCFluidBlock fluid = (OCFluidBlock)map.GetBlock(worldPos).block;

            for (int i = 0; i < 6; i++)
            {
                OCCubeBlock.CubeFace face    = OpenCog.Builder.OCCubeBuilder.faces[i];
                Vector3i             dir     = OpenCog.Builder.OCCubeBuilder.directions[i];
                Vector3i             nearPos = worldPos + dir;
                if (IsFaceVisible(map, nearPos, face))
                {
                    if (!onlyLight)
                    {
                        BuildFace(face, fluid, (UnityEngine.Vector3)localPos, mesh);
                    }
                    BuildFaceLight(face, map, worldPos, mesh);
                }
            }
        }
예제 #14
0
        public static void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight)
        {
            OpenCog.Map.OCBlockData block = map.GetBlock(worldPos);
            OCCubeBlock             cube  = (OCCubeBlock)block.block;

            OpenCog.Map.OCBlockDirection direction = block.GetDirection();

            for (int i = 0; i < 6; i++)
            {
                OCCubeBlock.CubeFace face    = faces[i];
                Vector3i             dir     = directions[i];
                Vector3i             nearPos = worldPos + dir;
                if (IsFaceVisible(map, nearPos))
                {
                    if (!onlyLight)
                    {
                        BuildFace(face, cube, direction, localPos, mesh);
                    }
                    BuildFaceLight(face, map, worldPos, mesh);
                }
            }
        }
예제 #15
0
        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Private Member Functions

        //---------------------------------------------------------------------------

        private static void Build(OpenCog.Map.OCChunk chunk, bool onlyLight)
        {
            OpenCog.Map.OCMap map = chunk.GetMap();
            _meshData.Clear();
            for (int z = 0; z < OpenCog.Map.OCChunk.SIZE_Z; z++)
            {
                for (int y = 0; y < OpenCog.Map.OCChunk.SIZE_Y; y++)
                {
                    for (int x = 0; x < OpenCog.Map.OCChunk.SIZE_X; x++)
                    {
                        OCBlock block = chunk.GetBlock(x, y, z).block;
                        if (block != null)
                        {
                            Vector3i localPos = new Vector3i(x, y, z);
                            Vector3i worldPos = OpenCog.Map.OCChunk.ToWorldPosition(chunk.GetPosition(), localPos);
                            if (worldPos.y > 0)
                            {
                                block.Build(localPos, worldPos, map, _meshData, onlyLight);
                            }
                        }
                    }
                }
            }
        }
예제 #16
0
 public abstract void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight);
예제 #17
0
 public override void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight)
 {
     OpenCog.Builder.OCCactusBuilder.Build(localPos, worldPos, map, mesh, onlyLight);
 }
예제 #18
0
 public OCChunk(OCMap map, Vector3i position)
 {
     this.map      = map;
     this.position = position;
 }
예제 #19
0
        private static void BuildFaceLight(OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face, OpenCog.Map.OCMap map, Vector3i pos, OpenCog.Builder.OCMeshBuilder mesh)
        {
            Vector3i dir = OpenCog.Builder.OCCubeBuilder.directions[(int)face];

            UnityEngine.Color color = OpenCog.Builder.OCBuildUtils.GetBlockLight(map, pos + dir);
            mesh.AddFaceColor(color);
        }
예제 #20
0
 private static void BuildFaceLight(OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face, OpenCog.Map.OCMap map, Vector3i pos, OpenCog.Builder.OCMeshBuilder mesh)
 {
     foreach (Vector3 ver in vertices[(int)face])
     {
         Color color = OpenCog.Builder.OCBuildUtils.GetSmoothVertexLight(map, pos, ver, face);
         mesh.AddColor(color);
     }
 }
예제 #21
0
 private static void BuildCrossLight(OpenCog.Map.OCMap map, Vector3i pos, OpenCog.Builder.OCMeshBuilder mesh)
 {
     UnityEngine.Color color = OpenCog.Builder.OCBuildUtils.GetBlockLight(map, pos);
     mesh.AddColors(color, vertices.Length);
 }
예제 #22
0
        //---------------------------------------------------------------------------

        #endregion

        //---------------------------------------------------------------------------

        #region Private Member Functions

        //---------------------------------------------------------------------------

        private static bool IsFaceVisible(OpenCog.Map.OCMap map, Vector3i nearPos)
        {
            OCBlock block = map.GetBlock(nearPos).block;

            return(!(block is OCCubeBlock) || block.IsAlpha());
        }