public static void BlendBlock(Block target, World world, WorldPos position, float strength, float additive) { WorldPos [] points = new WorldPos[7]; Block[] blocks = new Block[7]; Vector3 [] offsets = new Vector3[7]; Vector3[] globalPoints = new Vector3[7]; Vector3 [] relativeOffsets = new Vector3[7]; points [0] = new WorldPos(position.x, position.y, position.z); //prime points [1] = new WorldPos(position.x, position.y+1, position.z); //above points [2] = new WorldPos(position.x, position.y-1, position.z); //below points [3] = new WorldPos(position.x-1, position.y, position.z); //west points [4] = new WorldPos(position.x+1, position.y, position.z); //east points [5] = new WorldPos(position.x, position.y, position.z+1); //north points [6] = new WorldPos(position.x, position.y, position.z-1); //south Block aboveDiagonal = world.GetBlock (position.x+1, position.y+1, position.z+1); Block diagonal = world.GetBlock (position.x+1, position.y, position.z+1); Block aboveNorth = world.GetBlock (position.x, position.y+1, position.z+1); Block aboveEast = world.GetBlock (position.x+1, position.y+1, position.z); Block north = world.GetBlock (position.x, position.y, position.z+1); Block east = world.GetBlock (position.x+1, position.y, position.z); Block above = world.GetBlock (position.x, position.y, position.z); //prepare offsets where we might use them for (int a = 0; a < 7; a += 1) { blocks [a] = world.GetBlock (points [a].x, points [a].y, points [a].z); offsets [a] = blocks [a].getoffset (); globalPoints [a] = new Vector3 (points [a].x + offsets [a].x, points [a].y + offsets [a].y, points [a].z + offsets [a].z); relativeOffsets [a] = globalPoints [a] - globalPoints [0]; } //This next part tests the faces that may be associated with our target, or "prime" voxel. Vector3 vectorSum = new Vector3(.0f, .0f, .0f); int pointCount = 1; Vector3 faceDirection = new Vector3 (0f, 0f, 0f); //we will use this for adding and taking away ... hopefully if ((target.faces&1) != 0) //top face shares with point south and point west { vectorSum = vectorSum + new Vector3 (relativeOffsets [6].x, 0, relativeOffsets [6].z) + new Vector3 (relativeOffsets [3].x, 0, relativeOffsets [3].z); pointCount += 2; faceDirection.y += 1f; } else if((above.faces&2) != 0) { //(face down of above shares same points) vectorSum = vectorSum + new Vector3 (relativeOffsets [6].x, 0, relativeOffsets [6].z) + new Vector3 (relativeOffsets [3].x, 0, relativeOffsets [3].z); pointCount += 2; faceDirection.y -= 1f; } if ((aboveDiagonal.faces&2) != 0) //down face (of diagonal) shares with target, east, and north { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, 0, relativeOffsets [4].z) + new Vector3 (relativeOffsets [5].x, 0, relativeOffsets [5].z); pointCount += 2; faceDirection.y -= 1f; } else if((diagonal.faces&1) != 0) //face up of below the diagonal shares same { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, 0, relativeOffsets [4].z) + new Vector3 (relativeOffsets [5].x, 0, relativeOffsets [5].z); pointCount += 2; faceDirection.y += 1f; } if ((aboveNorth.faces&2) != 0) //bottom face shares with point north and point west { vectorSum = vectorSum + new Vector3 (relativeOffsets [5].x, 0, relativeOffsets [5].z) + new Vector3 (relativeOffsets [3].x, 0, relativeOffsets [3].z); pointCount += 2; faceDirection.y -= 1f; } else if((north.faces&1) != 0) { //(face up of north shares same points) vectorSum = vectorSum + new Vector3 (relativeOffsets [5].x, 0, relativeOffsets [5].z) + new Vector3 (relativeOffsets [3].x, 0, relativeOffsets [3].z); pointCount += 2; faceDirection.y += 1f; } if ((aboveEast.faces&2) != 0) //down face of east shares with target, east, and south { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, 0, relativeOffsets [4].z) + new Vector3 (relativeOffsets [6].x, 0, relativeOffsets [6].z); pointCount += 2; faceDirection.y -= 1f; } else if((east.faces&1) != 0) //face up of east same { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, 0, relativeOffsets [4].z) + new Vector3 (relativeOffsets [6].x, 0, relativeOffsets [6].z); pointCount += 2; faceDirection.y += 1f; } ////faces on top and bottom if ((target.faces&4) != 0) //north face is shared with bottom point and west point it is also north's south face { vectorSum = vectorSum + new Vector3 (relativeOffsets [2].x, relativeOffsets [2].y, 0) + new Vector3 (relativeOffsets [3].x, relativeOffsets [3].y, 0); pointCount += 2; faceDirection.z += 1f; } else if((north.faces&8) != 0) //south face of the north block { vectorSum = vectorSum + new Vector3 (relativeOffsets [2].x, relativeOffsets [2].y, 0) + new Vector3 (relativeOffsets [3].x, relativeOffsets [3].y, 0); pointCount += 2; faceDirection.z -= 1f; } if ((aboveDiagonal.faces&8) != 0) //south facing (of diagonal) shares the face with target, and target east, and above target { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, relativeOffsets [4].y, 0) + new Vector3 (relativeOffsets [1].x, relativeOffsets [1].y, 0); pointCount += 2; faceDirection.z -= 1f; } else if((aboveEast.faces&4) != 0) //north face of above east { vectorSum = vectorSum + new Vector3 (relativeOffsets [4].x, relativeOffsets [4].y, 0) + new Vector3 (relativeOffsets [1].x, relativeOffsets [1].y, 0); pointCount += 2; faceDirection.z += 1f; } if ((east.faces&4) != 0) //north face of east is shared with bottom point and east point { vectorSum = vectorSum + new Vector3 (relativeOffsets [2].x, relativeOffsets [2].y, 0) + new Vector3 (relativeOffsets [4].x, relativeOffsets [4].y, 0); pointCount += 2; faceDirection.z += 1f; } else if((diagonal.faces&8) != 0) //south face of block below diagonal { vectorSum = vectorSum + new Vector3 (relativeOffsets [2].x, relativeOffsets [2].y, 0) + new Vector3 (relativeOffsets [4].x, relativeOffsets [4].y, 0); pointCount += 2; faceDirection.z -= 1f; } if ((aboveNorth.faces&8) != 0) //south facing of aboveNorth shares the face with aboveTarget { vectorSum = vectorSum + new Vector3 (relativeOffsets [3].x, relativeOffsets [3].y, 0) + new Vector3 (relativeOffsets [1].x, relativeOffsets [1].y, 0); pointCount += 2; faceDirection.z -= 1f; } else if((above.faces&4) != 0) //north face of above { vectorSum = vectorSum + new Vector3 (relativeOffsets [3].x, relativeOffsets [3].y, 0) + new Vector3 (relativeOffsets [1].x, relativeOffsets [1].y, 0); pointCount += 2; faceDirection.z += 1f; } ////faces on north and south if ((target.faces&16) != 0) //east face of target is shared with bottom and south points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [2].y, relativeOffsets [2].z) + new Vector3(0, relativeOffsets [6].y, relativeOffsets [6].z) ; pointCount += 2; faceDirection.x += 1f; } else if((east.faces&32) != 0) //it is also the west face of east point { vectorSum = vectorSum + new Vector3(0, relativeOffsets [2].y, relativeOffsets [2].z) + new Vector3(0, relativeOffsets [6].y, relativeOffsets [6].z) ; pointCount += 2; faceDirection.x -= 1f; } if ((aboveDiagonal.faces&32) != 0) //west facing (of diagonal) shares target, north and above points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [5].y, relativeOffsets [5].z) + new Vector3(0, relativeOffsets [1].y, relativeOffsets [1].z) ; pointCount += 2; faceDirection.x -= 1f; } else if((aboveNorth.faces&16) != 0) //east face of above north is same points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [5].y, relativeOffsets [5].z) + new Vector3(0, relativeOffsets [1].y, relativeOffsets [1].z) ; pointCount += 2; faceDirection.x += 1f; } if ((north.faces&16) != 0) //east face of north block is shared with bottom and north points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [2].y, relativeOffsets [2].z) + new Vector3(0, relativeOffsets [5].y, relativeOffsets [5].z) ; pointCount += 2; faceDirection.x += 1f; } else if((diagonal.faces&32) != 0) //it is also the west face of belowDiagonal { vectorSum = vectorSum + new Vector3(0, relativeOffsets [2].y, relativeOffsets [2].z) + new Vector3(0, relativeOffsets [5].y, relativeOffsets [5].z) ; pointCount += 2; faceDirection.x -= 1f; } if ((aboveEast.faces&32) != 0) //west facing (of aboveeast) shares target, south and above points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [6].y, relativeOffsets [6].z) + new Vector3(0, relativeOffsets [1].y, relativeOffsets [1].z) ; pointCount += 2; faceDirection.x -= 1f; } else if((above.faces&16) != 0) //east face of above is same points { vectorSum = vectorSum + new Vector3(0, relativeOffsets [6].y, relativeOffsets [6].z) + new Vector3(0, relativeOffsets [1].y, relativeOffsets [1].z) ; pointCount += 2; faceDirection.x += 1f; } strength = 0.45f; Vector3 vectorAverage = vectorSum / pointCount; faceDirection = Vector3.Min (Vector3.Max (faceDirection, new Vector3 (-1f, -1f, -1f)), new Vector3 (1f, 1f, 1f)); //offsets [0] = Vector3.Min (Vector3.Max ((offsets [0] * (1 - strength)) + (vectorAverage * strength), Vector3.zero), Vector3.one); offsets [0] = offsets [0] + (vectorAverage*strength) + (faceDirection*additive);//((offsets [0] * (1f - strength)) + (vectorAverage * strength)); // Debug.Log (vectorSum); // Debug.Log (pointCount); // Debug.Log (offsets [0]); //trying - if we have moved against the face, we have decreased //if we have moved with the face, we have increased //now how do we compare the direction with our landing??? Block newBlock; Vector3 landingf = new Vector3 ((position.x + offsets [0].x), (position.y + offsets [0].y), (position.z + offsets [0].z)); WorldPos landing = new WorldPos ((int)landingf.x, (int)landingf.y, (int)landingf.z); bool outside = false; // newBlock = world.GetBlock (landing.x, landing.y, landing.z); // // if ((offsets [0].y) > 1.1f) { //we have moved up (landing is > position // newBlock.material = target.material; // } else if ((offsets [0].y) < -0.1f) { //we are moving down // target.material = blocks [2].material; // } // if ((offsets [0].x) > 1.1f) { //we moved east // newBlock.material = target.material; // } else if ((offsets [0].x) < -0.1f) { //we moved west // target.material = blocks [3].material; // } // if ((offsets [0].z) > 1.1f) { //we moved forward (north) // newBlock.material = target.material; // } else if ((offsets [0].z) < -0.1f) { //we moved south // target.material = blocks [6].material; // } // // if (outside) { //if you follow the code, you see that sometimes the material is not changed, but just the offsets of the landing block // newBlock.ClipOffset (offsets [0]); //sets as the remainder of the offset // world.SetBlock (landing.x, landing.y, landing.z, newBlock); // } target.SnapOffset (offsets [0]); world.SetBlock (position.x, position.y, position.z, target); }