public virtual MeshData FaceDataFront
            (Chunk chunk, int x, int y, int z, MeshData meshData, byte extendId)
        {
            Block centerBlock = chunk.GetBlock(x, y, z);
            Block leftBlock   = chunk.GetBlock(x - 1, y, z);
            Block rightBlock  = chunk.GetBlock(x + 1, y, z);
            Block frontBlock  = chunk.GetBlock(x, y, z + 1);
            Block leftFront   = chunk.GetBlock(x - 1, y, z + 1);
            Block rightFront  = chunk.GetBlock(x + 1, y, z + 1);

            float rightBackHeight  = GetAverageHeight(frontBlock, centerBlock, rightFront, rightBlock);
            float leftBackHeight   = GetAverageHeight(frontBlock, centerBlock, leftFront, leftBlock);
            float leftFrontHeight  = 0;
            float rightFrontHeight = 0;

            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y + leftFrontHeight, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y + rightFrontHeight, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y + rightBackHeight, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y + leftBackHeight, z + 1f));

            meshData.AddQuadTriangles();

//			AddSpecialUV(meshData,extendId,Direction.front);
            Vector2 dic = GetRotate(leftFrontHeight, rightFrontHeight, rightBackHeight, leftBackHeight);

            AddUVRotate(meshData, extendId, Direction.front, dic.y, dic.x);

            AddSpecialColorAndSpeed(chunk, x, y, z + 1, meshData, 2);

            return(meshData);
        }
        public virtual MeshData FaceDataDown
            (Chunk chunk, int x, int y, int z, MeshData meshData, byte extendId)
        {
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y, z));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y, z));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y, z + 1f));

            meshData.AddQuadTriangles();

            AddSpecialUV(meshData, extendId, Direction.down);
            AddSpecialColor(chunk, x, y - 1, z, meshData);
            return(meshData);
        }
示例#3
0
        public virtual MeshData FaceDataOne
            (Chunk chunk, int x, int y, int z, MeshData meshData, byte extendId)
        {
            if (GetFaceDirection(extendId) == Direction.front)
            {
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y, z + 0.5f));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y, z + 0.5f));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y + 1f, z + 0.5f));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y + 1f, z + 0.5f));
            }
            else
            {
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 0.5f, y, z + 1f));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 0.5f, y, z));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 0.5f, y + 1f, z));
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 0.5f, y + 1f, z + 1f));
            }

            meshData.AddQuadTriangles();

            AddSpecialUV(meshData, extendId, Direction.up);

            AddSpecialColor(chunk, x, y, z, meshData);
            return(meshData);
        }
        public virtual MeshData FaceDataUp
            (Chunk chunk, int x, int y, int z, MeshData meshData, byte extendId)
        {
            Block centerBlock = chunk.GetBlock(x, y, z);
            Block leftBlock   = chunk.GetBlock(x - 1, y, z);
            Block rightBlock  = chunk.GetBlock(x + 1, y, z);
            Block frontBlock  = chunk.GetBlock(x, y, z + 1);
            Block backBlock   = chunk.GetBlock(x, y, z - 1);
            Block leftFront   = chunk.GetBlock(x - 1, y, z + 1);
            Block leftBack    = chunk.GetBlock(x - 1, y, z - 1);
            Block rightFront  = chunk.GetBlock(x + 1, y, z + 1);
            Block rightBack   = chunk.GetBlock(x + 1, y, z - 1);

            float leftFrontHeight  = GetAverageHeight(leftBlock, centerBlock, leftFront, frontBlock);
            float rightFrontHeight = GetAverageHeight(rightBlock, centerBlock, rightFront, frontBlock);
            float rightBackHeight  = GetAverageHeight(rightBlock, centerBlock, rightBack, backBlock);
            float leftBackHeight   = GetAverageHeight(leftBlock, centerBlock, leftBack, backBlock);

//			//计算流体流动方向
//			float dicX = 2 * (leftBackHeight + leftFrontHeight - rightBackHeight - rightFrontHeight);
//			float dicZ = 2 * (leftBackHeight + rightBackHeight - leftFrontHeight - rightFrontHeight);
//			Vector2 dic = new Vector2(dicX,dicZ);
//			dic.Normalize();
//			if(dic.x == 0 && dic.y == 0)dic.x = 1;
//			float sinDic = dic.y;
//			float cosDic = dic.x;

            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y + leftFrontHeight, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y + rightFrontHeight, z + 1f));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x + 1f, y + rightBackHeight, z));
            meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(x, y + leftBackHeight, z));

            meshData.AddQuadTriangles();

//			AddSpecialUV(meshData,extendId,Direction.up);
            Vector2 dic = GetRotate(leftFrontHeight, rightFrontHeight, rightBackHeight, leftBackHeight);

            AddUVRotate(meshData, extendId, Direction.up, dic.y, dic.x);

            float speed = dic.magnitude == 0 ? 0 : 0.5f;

            AddSpecialColorAndSpeed(chunk, x, y, z, meshData, speed);

            return(meshData);
        }
示例#5
0
        public virtual void CalculateMesh(Chunk chunk, MeshData meshData, Block self, Direction renderDirection,
                                          Vector3 v1, Vector3 v2, Vector3 v3, Vector3 v4,
                                          LightVertice sunLight, LightVertice blockLight)
        {
            meshData.AddVertice(v1);
            meshData.AddVertice(v2);
            meshData.AddVertice(v3);
            meshData.AddVertice(v4);
            if ((int)renderDirection > 0)
            {
                meshData.AddQuadTriangles(true);
            }
            else
            {
                meshData.AddQuadTriangles(false);
            }
            AddRenderUV(meshData, self.ExtendId, renderDirection);

            meshData.AddColor(MeshBaseDataCache.Instance.GetColor(sunLight.v00, blockLight.v00, 0, 1));
            meshData.AddColor(MeshBaseDataCache.Instance.GetColor(sunLight.v01, blockLight.v01, 0, 1));
            meshData.AddColor(MeshBaseDataCache.Instance.GetColor(sunLight.v11, blockLight.v11, 0, 1));
            meshData.AddColor(MeshBaseDataCache.Instance.GetColor(sunLight.v10, blockLight.v10, 0, 1));
        }
示例#6
0
        public override void CalculateSpecialMesh(Chunk chunk, int x, int y, int z, MeshData meshData, Block self, Block other, BlockAttributeCalculator otherCalculator, Direction direction)
        {
            //因为会计算六次
            if (direction != Direction.right)
            {
                return;
            }
            if (!IsModelCenter(self.ExtendId))
            {
                return;
            }
            ModelData modelData  = ModelDataManager.Instance.GetModelData((int)self.BlockType);
            Direction face       = GetFaceDirection(self.ExtendId);
            Vector2   rotate     = GetRotateSinAndCos(face);
            int       sunLight   = chunk.GetSunLight(x, y, z, true);
            int       blockLight = chunk.GetBlockLight(x, y, z, true);
            Rect      rect       = GetUVRect(self.ExtendId, direction);

            meshData.useRenderDataForCol = true;
            int verticesIndex    = meshData.GetCurVerticesIndex();
            int colVerticesIndex = meshData.GetCurColVerticesIndex();

            for (int i = 0; i < modelData.vertices.Length; i++)
            {
                Vector3[] vertices = modelData.vertices;
                Vector2[] uvs      = modelData.uvs;

                float verX  = vertices[i].x * rotate.y + vertices[i].z * rotate.x;
                float verZ  = -vertices[i].x * rotate.x + vertices[i].z * rotate.y;
                float realX = x + 0.5f + verX;
                float realY = y + vertices[i].y;
                float realZ = z + 0.5f + verZ;
                //添加渲染网格
                meshData.AddVertice(MeshBaseDataCache.Instance.GetVector3(realX, realY, realZ));
                meshData.AddColor(MeshBaseDataCache.Instance.GetColor(LightConst.lightColor[sunLight], LightConst.lightColor[blockLight], 0, 2));
                //这里要转换uv坐标
                meshData.AddUV(MeshBaseDataCache.Instance.GetVector2(rect.x + uvs[i].x * rect.width, rect.y + uvs[i].y * rect.height));

                //添加碰撞网格
                meshData.AddColVertice(MeshBaseDataCache.Instance.GetVector3(realX, realY, realZ));
            }
            for (int i = 0; i < modelData.triangles.Length; i++)
            {
                meshData.AddTriangle(verticesIndex + modelData.triangles[i]);

                meshData.AddColTriangle(colVerticesIndex + modelData.triangles[i]);
            }
            meshData.useRenderDataForCol = MeshData.DefaultUseRenderDataForCol;
        }