public OCFileTerrainGenerator(OpenCog.Map.OCMap map, string mapName)
{
		System.Console.WriteLine(OCLogSymbol.CREATE + this.GetType().ToString ());

        map.MapName = mapName;

        _map = map;
		
        UnityEngine.Object[] objects = Resources.LoadAll(mapName + "/level");
		
        //Debug.Log("Objects Loaded: ");
        foreach(UnityEngine.Object obj in objects)
        {
			System.Console.WriteLine(OCLogSymbol.DETAILEDINFO + obj.ToString() + "was Loaded.");
        }
		
        string dataPath;

//		if(Application.isEditor)
//		{
//			dataPath = UnityEngine.Application.dataPath + "/OpenCog Assets/Maps/StreamingAssets/";
//		}
//		else
        {
                dataPath = Application.streamingAssetsPath;
        }
		
        System.Console.WriteLine(OCLogSymbol.DETAILEDINFO + "Data Path:" + dataPath);
		
        _fullMapPath = System.IO.Path.Combine(dataPath, mapName);
}
public OCFileTerrainGenerator(OpenCog.Map.OCMap map, string mapName)
{
        map.MapName = mapName;

        _map = map;
		
        UnityEngine.Object[] objects = Resources.LoadAll(mapName + "/level");
		
        Debug.Log("Objects Loaded: ");
        foreach(UnityEngine.Object obj in objects)
        {
                Debug.Log(obj.ToString());
        }
		
        string dataPath;

//		if(Application.isEditor)
//		{
//			dataPath = UnityEngine.Application.dataPath + "/OpenCog Assets/Maps/StreamingAssets/";
//		}
//		else
        {
                dataPath = Application.streamingAssetsPath;
        }
		
        Debug.Log(dataPath);
		
        _fullMapPath = System.IO.Path.Combine(dataPath, mapName);
}
	private static Contact? GetClosestContact(OpenCog.Map.OCMap map, CharacterController controller) {
		Vector3 pos = controller.transform.position;
		int x1 = Mathf.FloorToInt(pos.x-controller.radius);
		int y1 = Mathf.FloorToInt(pos.y);
		int z1 = Mathf.FloorToInt(pos.z-controller.radius);
		
		int x2 = Mathf.CeilToInt(pos.x+controller.radius);
		int y2 = Mathf.CeilToInt(pos.y+controller.height);
		int z2 = Mathf.CeilToInt(pos.z+controller.radius);
		
		Contact? contact = null;
		for(int x=x1; x<=x2; x++) {
			for(int y=y1; y<=y2; y++) {
				for(int z=z1; z<=z2; z++) {
					OpenCog.Map.OCBlockData block = map.GetBlock(x, y, z);
					if(block.IsSolid()) {
						Contact? _newContact = BlockCharacterCollision.GetContactBlockCharacter(new Vector3i(x, y, z), pos, controller);
						if(_newContact.HasValue && _newContact.Value.delta.magnitude > float.Epsilon) {
							Contact newContact = _newContact.Value;
							if(!contact.HasValue || newContact.sqrDistance > contact.Value.sqrDistance) {
								contact = newContact;
							}
						}
					}
				}
			}
		}

		return contact;
//		return null;
	}
	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");
	}
	//---------------------------------------------------------------------------

	#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);
	}
	//---------------------------------------------------------------------------

	#endregion

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

	#region Accessors and Mutators

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

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

	#endregion

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

	#region Public Member Functions

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

	public override void Init(OpenCog.BlockSet.OCBlockSet blockSet) {
		base.Init(blockSet);
		
		_texCoords = new UnityEngine.Vector2[][] {
			ToTexCoords(_front), ToTexCoords(_back),
			ToTexCoords(_right), ToTexCoords(_left),
			ToTexCoords(_top),   ToTexCoords(_bottom)
		};
	}
		// TODO: May need to be re-enabled...hope not, since all blockdata that gets instantiated should get its coordinates too.
	//	public BlockData(Block block) {
	//		this.block = block;
	//		direction = BlockDirection.Z_PLUS;
	//	}
	
//		public OCBlockData() 
//		{
//		}
		
		public OCBlockData Init(OpenCog.BlockSet.BaseBlockSet.OCBlock block, Vector3i globalPosition)
		{
			this.block = block;
			this._globalX = globalPosition.x;
			this._globalY = globalPosition.y;
			this._globalZ = globalPosition.z;
			direction = OCBlockDirection.Z_PLUS;
			return this;
		}
	public static void Collision(OpenCog.Map.OCMap map, CharacterController controller) {
		for(int i=0; i<3; i++) {
			Contact? _contact = GetClosestContact(map, controller);
			if(!_contact.HasValue) break;
			Contact contact = _contact.Value;
			controller.transform.position += contact.delta;
			//@TODO: Figure out a better way to do map / character collisions...
			//controller.collider.OnCollision(contact.b, contact.delta.normalized);
		}
	}
	//---------------------------------------------------------------------------

	#region Private Member Data

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

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

	#endregion

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

	#region Accessors and Mutators

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

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

	#endregion

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

	#region Public Member Functions

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

	public static OpenCog.Builder.OCMeshBuilder Build(OpenCog.BlockSet.BaseBlockSet.OCCactusBlock cactus) {
		OpenCog.Builder.OCMeshBuilder mesh = new OpenCog.Builder.OCMeshBuilder();
		for(int i=0; i<vertices.Length; i++) {
			mesh.AddFaceIndices( 0 );
			mesh.AddVertices( vertices[i], Vector3.zero );
			mesh.AddNormals( normals[i] );
			
			Vector2[] texCoords = cactus.GetFaceUV((OCCubeBlock.CubeFace)i);
			mesh.AddTexCoords(texCoords);
			mesh.AddFaceColor( new Color(0,0,0,1) );
		}
		return mesh;
	}
	public static Vector3? Intersection(OpenCog.Map.OCMap map, Ray ray, float distance) {
		Vector3 start = ray.origin;
		Vector3 end = ray.origin+ray.direction*distance;
		int startX = Mathf.RoundToInt(start.x);
		int startY = Mathf.RoundToInt(start.y);
		int startZ = Mathf.RoundToInt(start.z);
		int endX = Mathf.RoundToInt(end.x);
		int endY = Mathf.RoundToInt(end.y);
		int endZ = Mathf.RoundToInt(end.z);
		
		if(startX>endX) {
			int tmp = startX;
			startX = endX;
			endX = tmp;
		}
		
		if(startY>endY) {
			int tmp = startY;
			startY = endY;
			endY = tmp;
		}
		
		if(startZ>endZ) {
			int tmp = startZ;
			startZ = endZ;
			endZ = tmp;
		}
		
		float minDistance = distance;
		for(int z=startZ; z<=endZ; z++) {
			for(int y=startY; y<=endY; y++) {
				for(int x=startX; x<=endX; x++) {
					OpenCog.Map.OCBlockData block = map.GetBlock(x, y, z);
					if(block == null || block.IsEmpty() || block.IsFluid()) continue;
					float dis = BlockRayIntersection(new Vector3(x, y, z), ray);
					minDistance = Mathf.Min(minDistance, dis);
				}
			}
		}
		
		if(minDistance != distance) return ray.origin + ray.direction * minDistance;
		return null;
	}
	//---------------------------------------------------------------------------

	#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);
			}
		}
	}
	//---------------------------------------------------------------------------

	#region Private Member Data

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

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

	#endregion

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

	#region Accessors and Mutators

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

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

	#endregion

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

	#region Public Member Functions

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

	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;
		}
	}
	//---------------------------------------------------------------------------

	#endregion

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

	#region Accessors and Mutators

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

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

	#endregion

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

	#region Public Member Functions

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

	public override void Init(OpenCog.BlockSet.OCBlockSet blockSet) {
		base.Init(blockSet);
		_faceVectors = ToTexCoords(_face);
	}
	public static OpenCog.Builder.OCMeshBuilder Build(OpenCog.BlockSet.BaseBlockSet.OCFluidBlock fluid)
	{
		OpenCog.Builder.OCMeshBuilder mesh = new OpenCog.Builder.OCMeshBuilder();
		for(int i=0; i<OpenCog.Builder.OCCubeBuilder.vertices.Length; i++)
		{
			mesh.AddFaceIndices(0);
			mesh.AddVertices(OpenCog.Builder.OCCubeBuilder.vertices[i], UnityEngine.Vector3.zero);
			mesh.AddNormals(OpenCog.Builder.OCCubeBuilder.normals[i]);
			mesh.AddTexCoords(fluid.GetFaceUV());
			mesh.AddFaceColor(new UnityEngine.Color(0, 0, 0, 1));
		}
		return mesh;
	}
	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);
	}
	private static void BuildFace(OpenCog.BlockSet.BaseBlockSet.OCCubeBlock.CubeFace face, OpenCog.BlockSet.BaseBlockSet.OCFluidBlock fluid, UnityEngine.Vector3 localPos, OpenCog.Builder.OCMeshBuilder mesh)
	{
		int iFace = (int)face;
		
		mesh.AddFaceIndices(fluid.AtlasID);
		mesh.AddVertices(OpenCog.Builder.OCCubeBuilder.vertices[iFace], localPos);
		mesh.AddNormals(OpenCog.Builder.OCCubeBuilder.normals[iFace]);
		mesh.AddTexCoords(fluid.GetFaceUV());
	}
	//---------------------------------------------------------------------------

	#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();
		}
	}
	public UnityEngine.Vector2[] GetFaceUV(CubeFace face, OpenCog.Map.OCBlockDirection dir) {
		face = TransformFace(face, dir);
		return _texCoords[ (int)face ];
	}
	private void BuildBlock(OpenCog.BlockSet.BaseBlockSet.OCBlock block) {
		renderer.material = block.Atlas.Material;
		MeshFilter filter = GetComponent<MeshFilter>();
		block.Build().ToMesh(filter.mesh);
	}
	//---------------------------------------------------------------------------

	#endregion

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

	#region Private Member Functions

	//---------------------------------------------------------------------------
	
	private static int DrawList(Rect position, int selected, OpenCog.BlockSet.OCBlockSet[] list, ref Vector2 scrollPosition) {
		GUILayout.BeginArea(position, GUI.skin.box);
		scrollPosition = GUILayout.BeginScrollView(scrollPosition);
		for(int i=0; i<list.Length; i++) {
			if( DrawItem(list[i].name, i == selected) ) {
				selected = i;
				Event.current.Use();
			}
		}
		GUILayout.EndScrollView();
		GUILayout.EndArea();
		return selected;
	}
	//---------------------------------------------------------------------------

	#endregion

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

	#region Private Member Functions

	//---------------------------------------------------------------------------
	
	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;
		}
	}
	private static bool DrawBlock(OpenCog.BlockSet.BaseBlockSet.OCBlock block, bool selected) {
		UnityEngine.Rect rect = GUILayoutUtility.GetAspectRect(1f);
		
		if(selected) GUI.Box(rect, GUIContent.none);
		
		UnityEngine.Vector3 center = rect.center;
		rect.width -= 8;
		rect.height -= 8;
		rect.center = center;
		
		if(block != null) return block.DrawPreview(rect);
		return false;
	}
Exemple #23
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.GetComponent<UnityEngine.Renderer>().castShadows = false;
		go.GetComponent<UnityEngine.Renderer>().receiveShadows = false;
		
		return chunkRenderer;
	}
	public static CubeFace TransformFace(CubeFace face, OpenCog.Map.OCBlockDirection dir) {
		if(face == CubeFace.Top || face == CubeFace.Bottom) {
			return face;
		}
		
		//Front, Right, Back, Left
		//0      90     180   270
		
		int angle = 0;
		if(face == CubeFace.Right) angle = 90;
		if(face == CubeFace.Back)  angle = 180;
		if(face == CubeFace.Left)  angle = 270;
		
		if(dir == OpenCog.Map.OCBlockDirection.X_MINUS) angle += 90;
		if(dir == OpenCog.Map.OCBlockDirection.Z_MINUS) angle += 180;
		if(dir == OpenCog.Map.OCBlockDirection.X_PLUS) angle += 270;
		
		angle %= 360;
		
		if(angle == 0) return CubeFace.Front;
		if(angle == 90) return CubeFace.Right;
		if(angle == 180) return CubeFace.Back;
		if(angle == 270) return CubeFace.Left;
		
		return CubeFace.Front;
	}
	public override void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight) {
		OpenCog.Builder.OCCrossBuilder.Build(localPos, worldPos, map, mesh, onlyLight);
	}
	//---------------------------------------------------------------------------

	#endregion

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

	#region Accessors and Mutators

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

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

	#endregion

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

	#region Public Member Functions

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

	public void SetBlockSet(OpenCog.BlockSet.OCBlockSet blockSet) {
		this.blockSet = blockSet;
		index = Mathf.Clamp(index, 0, blockSet.BlockCount);
		BuildBlock( blockSet.GetBlock(index) );
	}
	private static OpenCog.BlockSet.BaseBlockSet.OCBlock DrawInventory(OpenCog.BlockSet.OCBlockSet blockSet, ref UnityEngine.Vector2 scrollPosition, OpenCog.BlockSet.BaseBlockSet.OCBlock selected) {
		scrollPosition = GUILayout.BeginScrollView(scrollPosition);
		for(int i=0, y=0; i<blockSet.BlockCount; y++) {
			GUILayout.BeginHorizontal();
			for(int x=0; x<8; x++, i++) {
				OpenCog.BlockSet.BaseBlockSet.OCBlock block = blockSet.GetBlock(i);
				if( DrawBlock(block, block == selected && selected != null) ) {
					selected = block;
				}
			}
			GUILayout.EndHorizontal();
		}
		GUILayout.EndScrollView();
		return selected;
	}
		public OCObjectMapInfo(int chunkX, int chunkY, int chunkZ, int blockGlobalX, int blockGlobalY, int blockGlobalZ, OpenCog.Map.OCBlockData blockData)
		{
			string blockName = "BLOCK_" + blockData.GetHashCode();
			
			_height = 1;
			_width = 1;
			_length = 1;
			_type = OCEmbodimentXMLTags.STRUCTURE_OBJECT_TYPE;
			_id = blockName;//blockData.ID.ToString();
			_name = blockName;
			//this.Velocity = UnityEngine.Vector3.zero;
			this.position = new UnityEngine.Vector3(blockGlobalX, blockGlobalY, blockGlobalZ);
			_rotation = new OpenCog.Utility.Rotation(0, 0, 0);

			// Add block properties
//			AddTag ("class", "block", System.Type.GetType("System.String"));
//			AddTag ("visibility-status", "visible", System.Type.GetType("System.String"));
//			AddTag ("detector", "true", System.Type.GetType("System.Boolean"));
			
			AddProperty ("class", "block", System.Type.GetType("System.String"));
			AddProperty ("visibility-status", "visible", System.Type.GetType("System.String"));
			AddProperty ("detector", "true", System.Type.GetType("System.Boolean"));
			
			if (blockGlobalX == 9 && blockGlobalY == 140 && blockGlobalZ == 10)
			{
				UnityEngine.Debug.Log ("Break here plz...");	
			}
			
			try {
				string blockType = blockData.block.GetName();
				
				if (blockType.ToLower() != "air")
				{
					string balls = "lol";
					string lol = balls + "lol";	
				}
				
				//UnityEngine.Debug.Log ("BlockData.GetType = " + blockType);	
			} catch (System.Exception ex) {
				
			}
			
			if (blockData.block == null)
			{
				// Report air
//				this.AddTag (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "0", System.Type.GetType("System.String"));
				this.AddProperty (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "0", System.Type.GetType("System.String"));
			}
			else
			{
				this.AddProperty (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, blockData.block.GetName().ToLower (), System.Type.GetType("System.String"));
//				if (blockData.block.GetName().ToLower () == "air")
//				{
////					this.AddTag (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "0", System.Type.GetType("System.String"));
//					this.AddProperty (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "0", System.Type.GetType("System.String"));
//				}
//				else
//				{
////					this.AddTag (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "13", System.Type.GetType("System.String"));
//					this.AddProperty (OCEmbodimentXMLTags.MATERIAL_ATTRIBUTE, "13", System.Type.GetType("System.String"));
//				}
			}
			//mapinfo.AddProperty("color_name", "green", PropertyType.STRING);
		}
	public void sendBlockStructure(OpenCog.Map.OCBlockData startBlock, bool isToRecognize)
	{
		XmlDocument doc = new XmlDocument();
		XmlElement root = MakeXMLElementRoot(doc);
		string timestamp = GetCurrentTimestamp();
 
		XmlElement signal = (XmlElement)root.AppendChild(doc.CreateElement("block-structure-signal"));
		if(isToRecognize)
		{
			signal.SetAttribute("recognize-structure", "true");
	        
			signal.SetAttribute("startblock-x", startBlock.GlobalX.ToString());
			signal.SetAttribute("startblock-y", startBlock.GlobalY.ToString());
			signal.SetAttribute("startblock-z", startBlock.GlobalZ.ToString());
		}
		signal.SetAttribute("timestamp", timestamp);
	
		OCMessage message = OCMessage.CreateMessage(_ID, _brainID, OCMessage.MessageType.STRING, BeautifyXmlText(doc));
        
		OCLogger.Debugging("sending block structure signal: \n" + BeautifyXmlText(doc));
        
		lock(_messageSendingLock)
		{
			_messagesToSend.Add(message);
		}
	}
	public abstract void Build(Vector3i localPos, Vector3i worldPos, OpenCog.Map.OCMap map, OpenCog.Builder.OCMeshBuilder mesh, bool onlyLight);