示例#1
0
    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);
    }