Esempio n. 1
0
        public V3 Vector3ToV3(Vector3 vector3, float GridSize)
        {
            var v  = VoxelRenderManager.Fixed(vector3, GridSize);
            var v3 = new V3();

            v3.x = (int)(v.x / GridSize + 0.5f);
            v3.y = (int)(v.y / GridSize + 0.5f);
            v3.z = (int)(v.z / GridSize + 0.5f);
            return(v3);
        }
Esempio n. 2
0
        public void InitRender()
        {
            ClearVoxel(transform.Find("renderer"));
            if (renderRoot == null)
            {
                renderRoot               = new GameObject("renderer").transform;
                renderRoot.parent        = transform;
                renderRoot.localPosition = Vector3.zero;
            }
            int i = 0;

            voxels = new Transform[voxelData.voxels.Count];
            foreach (var v in voxelData.voxels)
            {
                voxels[i] = VoxelRenderManager.CreateViewObj(voxelData, material, v, GridSize, renderRoot).transform;
                i++;
            }
        }
Esempio n. 3
0
        void CreateRenderData()
        {
            var texturePath = "Assets/Model/VoxelModelData/" + renderer.name + "_vr.png";
            var tex         = SavePng(VoxelRenderManager.CreatTexture(voxelData), texturePath);

            var materialPath = "Assets/Model/VoxelModelData/" + renderer.name + "_vr.mat";

            renderer.material = SaveMat(VoxelRenderManager.CreateMaterial(voxelData, tex), materialPath);

            var maxVoxelCount = 5000;

            if (voxelData.voxels.Count > maxVoxelCount)
            {
                Debug.LogError("【VoxelRenderer】体素数目过大 " + voxelData.voxels.Count + "超过" + maxVoxelCount + " 中止生成显示块");
                return;
            }
            //SaveVoxelData();
        }
Esempio n. 4
0
        public void ParseMeshRendererToVoxel(float GridSize)
        {
            var mesh = MeshMerge();

            if (mesh == null)
            {
                return;
            }
            var vertices = mesh.vertices;
            var normals  = mesh.normals;
            Dictionary <V3, Color> colors = new Dictionary <V3, Color>();

            for (int i = 0; i < vertices.Length; i++)
            {
                var v = Vector3ToV3(vertices[i] - normals[i] * GridSize / 2, GridSize);
                if (!colors.ContainsKey(v))
                {
                    var uv = new int[] { (int)(mesh.uv[i].x * newText.width), (int)(mesh.uv[i].y * newText.height) };
                    colors.Add(v, newText.GetPixel(uv[0], uv[1]));
                }
            }
            voxelData = VoxelRenderManager.Parse(colors);
        }
Esempio n. 5
0
 public void RenderVoxel(Transform voxel, Transform bone, Vector3 bindPose)
 {
     voxel.transform.rotation = Quaternion.identity;
     voxel.transform.position = VoxelRenderManager.Fixed(bone.transform.position - (bone.right * bindPose.x + bone.forward * bindPose.z + bone.up * bindPose.y), GridSize);
 }
Esempio n. 6
0
        public static VoxelData ReadData(BinaryReader reader)
        {
            var vox = reader.ReadBytes(4);

            if (!Compare("VOX ", vox))
            {
                ErrorCantFind("VOX");
                return(null);
            }
            var version = reader.ReadBytes(4);
            var main    = reader.ReadBytes(4);

            if (!Compare("MAIN", main))
            {
                ErrorCantFind("MAIN");
                return(null);
            }
            var voxelData = VoxelRenderManager.GetData();
            int mainSize  = reader.ReadInt32();
            int childSize = reader.ReadInt32();

            reader.ReadBytes(mainSize);
            int    readSize   = 0;
            string unKnowNode = "";

            while (readSize < childSize)
            {
                var nodeType = reader.ReadBytes(4);
                if (Compare("PACK", nodeType))
                {
                    int packDataSize  = reader.ReadInt32();
                    int packChildSize = reader.ReadInt32();
                    reader.ReadInt32();
                    readSize += packDataSize + packChildSize + 4 * 3;
                }
                else if (Compare("SIZE", nodeType))
                {
                    readSize += ReadSize(reader, voxelData);
                }
                else if (Compare("XYZI", nodeType))
                {
                    readSize += ReadVoxelIndex(reader, voxelData);
                }
                else if (Compare("RGBA", nodeType))
                {
                    readSize += ReadColor(reader, voxelData);
                }
                else
                {
                    var typeStr = System.Text.Encoding.ASCII.GetString(nodeType);
                    if (!unKnowNode.Contains(typeStr))
                    {
                        unKnowNode += "[" + typeStr + "]";
                    }

                    int chunkContentBytes = reader.ReadInt32();
                    int childrenBytes     = reader.ReadInt32();
                    reader.ReadBytes(chunkContentBytes + childrenBytes);
                    readSize += chunkContentBytes + childrenBytes + 12;
                }
            }
            Warning(" 不支持解析节点类型 " + unKnowNode);
            Log(" 导入体素模型完成 体素数目" + voxelData.voxels.Count);
            return(voxelData);
        }