Exemple #1
0
    void NV_Handler(SurfExtractReqMC req)
    {
        int nMesh = req.Ret.FillMesh(null);

        if (nMesh == 0)
        {
            req._chunkData.AttachChunkGo(null);
            return;
        }
        Material defMat = null;

        GameObject   go = new GameObject();
        MeshFilter   mf = go.AddComponent <MeshFilter>();
        MeshCollider mc = go.AddComponent <MeshCollider>();
        MeshRenderer mr = go.AddComponent <MeshRenderer>();

        mc.sharedMesh     = null;
        mr.sharedMaterial = defMat;
        nMesh             = req.Ret.FillMesh(mf.mesh);
        go.name           = "chunk_" + req.Signature;
        while (nMesh > 0)
        {
            GameObject   goChild = new GameObject();
            MeshFilter   mfChild = goChild.AddComponent <MeshFilter>();
            MeshCollider mcChild = goChild.AddComponent <MeshCollider>();
            MeshRenderer mrChild = goChild.AddComponent <MeshRenderer>();
            mcChild.sharedMesh     = null;
            mrChild.sharedMaterial = defMat;
            nMesh = req.Ret.FillMesh(mfChild.mesh);
            goChild.transform.parent        = go.transform;
            goChild.transform.localPosition = Vector3.zero;
            goChild.name = "chunk_sub";
        }
    }
Exemple #2
0
    public static SurfExtractReqMC Get(VFVoxelChunkData chunk, Action <SurfExtractReqMC> finHandler)
    {
        SurfExtractReqMC req = Get(chunk);

        req._customFinHandler = finHandler;
        return(req);
    }
    public void Exec()
    {
        reqToProceed = null;
        lock (_reqList)
            reqToProceed = PickReqToProceed();
        if (reqToProceed == null)
        {
            return;
        }

        swMarchingCubes.setInputChunkData(_chunkDataToProceed);
        swMarchingCubes.Rebuild();

        SurfExtractReqMC req = reqToProceed as SurfExtractReqMC;
        int chunkTotalVerts  = swMarchingCubes.VertexList.Count;

        if (chunkTotalVerts > 0)
        {
            req.FillOutData(swMarchingCubes.VertexList, swMarchingCubes.Norm01List, swMarchingCubes.Norm2tList, 0, chunkTotalVerts);
        }

        lock (_reqFinishedList)
            _reqFinishedList.Add(reqToProceed);
        _chunkDataToProceed = null;
    }
Exemple #4
0
    public void ChunkProcPostGenMesh(IVxSurfExtractReq ireq)
    {
        SurfExtractReqMC req  = ireq as SurfExtractReqMC;
        VFVoxelChunkGo   vfGo = VFVoxelChunkGo.CreateChunkGo(req);

        req._chunk.AttachChunkGo(vfGo, req);
#if !ScopedCollider
        if (vfGo != null)
        {
            bChunkColliderRebuilding = true;
            vfGo._mc.sharedMesh      = null;
            vfGo._mc.sharedMesh      = vfGo._mf.mesh;
            foreach (Transform subGo in vfGo.transform)
            {
                VFVoxelChunkGo vfGoSub = subGo.GetComponent <VFVoxelChunkGo>();
                if (vfGoSub != null)
                {
                    vfGoSub._mc.sharedMesh = null;
                    vfGoSub._mc.sharedMesh = vfGoSub._mf.mesh;
                }
            }
            bChunkColliderRebuilding = false;
        }
#endif
    }
 public void AddToBuildList()        // Can be called from the main thread
 {
     if (IsHollow)
     {
         FinHollowUpdate();      return;
     }
     BuildStep = BuildStep_StartGoCreating;
     _helperProc.SurfExtractor.AddSurfExtractReq(SurfExtractReqMC.Get(this, VertsThreshold));
 }
    // The above functions can be invoked in other thread
    // The below function will be invoked in main thread.
    public void AttachChunkGo(VFVoxelChunkGo vfGo, SurfExtractReqMC req = null)
    {
        if (vfGo != null)
        {
            float fScale = (1 << _chunkPosLod.w);
#if UNITY_EDITOR
            vfGo.name = PatheaScript.Util.GetChunkName(_chunkPosLod);
#endif
            vfGo.transform.localScale = new Vector3(fScale, fScale, fScale);
            vfGo.transform.position   = Pos;
            vfGo.Data            = this;
            vfGo.OriginalChunkGo = null;
            if (null != _goChunk && _goChunk.name.Equals(vfGo.name))
            {
                if (_goChunk.OriginalChunkGo != null)
                {
                    vfGo.OriginalChunkGo     = _goChunk.OriginalChunkGo;
                    _goChunk.OriginalChunkGo = null;
                }
                else if (_goChunk.Mc.sharedMesh != null)
                {
                    vfGo.OriginalChunkGo = _goChunk;
                    _goChunk.Mr.enabled  = false;
                    _goChunk             = null;
                }
            }
            else if (_node != null && SigOfType == VFVoxelTerrain.self.ChunkSig)
            {
                _node.OnMeshCreated();
            }
        }
        if (null != _goChunk)
        {
            VFGoPool <VFVoxelChunkGo> .FreeGo(_goChunk);
        }
        _goChunk  = vfGo;
        _bNoVerts = vfGo == null;

        if (_node != null && req != null)
        {
            if (!req.IsInvalid)
            {
#if BegEndUpdateNodeDataInSameThread
                lock (s_lstReqsToEndUpdateNodeData)
                {
                    s_lstReqsToEndUpdateNodeData.Add(new EndUpdateReq(req));
                }
#else
                EndUpdateNodeData();
#endif
            }
            return;
        }

        BuildStep = BuildStep_NotInBuild;
    }
Exemple #7
0
    public void ChunkProcPostGenMesh(IVxSurfExtractReq ireq)
    {
        SurfExtractReqMC req  = ireq as SurfExtractReqMC;
        VFVoxelChunkGo   vfGo = VFVoxelChunkGo.CreateChunkGo(req, _waterMat, s_layer);

        if (vfGo != null)
        {
            vfGo.transform.parent = gameObject.transform;
        }
        req._chunk.AttachChunkGo(vfGo, req);
    }
Exemple #8
0
    void ProcGenSeaSurface(SurfExtractReqMC req)
    {
        _tmpSeaSurfaceVerts.Clone(_seaSurfaceVerts [req._chunk.LOD]);           // To avoid outputdata(_seaSurfaceVerts) from clearing
        req.AddOutData(_tmpSeaSurfaceVerts);

        VFVoxelChunkGo vfGo = VFVoxelChunkGo.CreateChunkGo(req, _waterMat, s_layer);

        vfGo.transform.parent = gameObject.transform;
        req._chunkData        = _tmpSurfChunkData4Req;
        req._chunk.AttachChunkGo(vfGo, req);
    }
Exemple #9
0
    public static SurfExtractReqMC Get(VFVoxelChunkData chunk, int nVertsPerMesh = SurfExtractorsMan.c_vertsCnt4Pool)
    {
        //SurfExtractReqMC req = new SurfExtractReqMC ();
        SurfExtractReqMC req = s_reqPool.Get();

        req._chunk            = chunk;
        req._chunkData        = chunk.DataVT;
        req._chunkSig         = chunk.SigOfChnk;
        req._chunkStamp       = chunk.StampOfUpdating;
        req._customFinHandler = null;
        req._nVertsPerMesh    = nVertsPerMesh;
        return(req);
    }
Exemple #10
0
    public static void Free(SurfExtractReqMC req)
    {
        int n = req._outDatas.Count;

        if (n > 0)
        {
            // If mesh data not been filled
            for (int i = 0; i < n; i++)
            {
                MCOutputData.Free(req._outDatas [i]);
            }
            req._outDatas.Clear();
        }
        s_reqPool.Free(req);
    }
Exemple #11
0
    // Delegates
    public void OnWaterDataLoad(VFVoxelChunkData chunkData, byte[] chunkDataVT, bool bFromPool)
    {
        if (chunkDataVT.Length != VFVoxel.c_VTSize || chunkDataVT[0] != c_iSurfaceVol)
        {
            // not surface chunk
            chunkData.OnDataLoaded(chunkDataVT, bFromPool);
            return;
        }

        // surface chunk
        int step = 1 << chunkData.LOD;

        if (c_fWaterLvl >= ((chunkData.ChunkPosLod.y + step) << VoxelTerrainConstants._shift))
        {
            chunkData.OnDataLoaded(VFVoxelChunkData.S_ChunkDataWaterSolid);
            return;
        }

        if (_seaSurfaceVerts[chunkData.LOD] == null)
        {
            float     fy  = (c_fWaterLvl - (chunkData.ChunkPosLod.y << VoxelTerrainConstants._shift)) / step;
            Vector3[] pos = new Vector3[4] {
                new Vector3(0.0f, fy, 0.0f),
                new Vector3(0.0f, fy, 32.0f),
                new Vector3(32.0f, fy, 0.0f),
                new Vector3(32.0f, fy, 32.0f),
            };
            Vector2[] norm01 = new Vector2[4] {
                new Vector2(), new Vector2(), new Vector2(), new Vector2(),
            };
            Vector2[] norm2t = new Vector2[4] {
                new Vector2(), new Vector2(), new Vector2(), new Vector2(),
            };
            int[] indice = new int[6] {
                0, 1, 2, 1, 3, 2
            };
            MCOutputData chunkMeshData = new MCOutputData(pos, norm01, norm2t, indice);
            _seaSurfaceVerts[chunkData.LOD] = chunkMeshData;
        }
        lock (_seaSurfaceChunkReqs)
        {
            _seaSurfaceChunkReqs.Add(SurfExtractReqMC.Get(chunkData, ProcGenSeaSurface));
        }
        // if surface chunk data not the following format, we should set it to this
        //chunkDataVT[0] = c_iSurfaceVol;
        //chunkDataVT[1] = c_iSeaWaterType;
        chunkData.SetDataVT(chunkDataVT);
    }
Exemple #12
0
    public void Exec()
    {
        lock (_reqList)
            PickReqToProceed();

        int nNumChunks = oclMarchingCube.numChunks;

        if (nNumChunks == 0)
        {
            return;
        }

        IEnumerator e = oclMarchingCube.computeIsosurfaceAsyn();

        while (e.MoveNext())
        {
            ;
        }

        Vector3[] posArray       = oclMarchingCube.hPosArray.Target as Vector3[];
        Vector2[] srcNorm01Array = oclMarchingCube.hNorm01Array.Target as Vector2[];
        Vector2[] srcNorm2tArray = oclMarchingCube.hNorm2tArray.Target as Vector2[];
        for (int i = 0; i < nNumChunks; i++)
        {
            SurfExtractReqMC req = _reqInProcessList[i] as SurfExtractReqMC;
            int prevChunkVerts   = oclScanLaucher.ofsData[i];
            int chunkTotalVerts  = i == nNumChunks - 1 ? (oclScanLaucher.sumData[0] - prevChunkVerts) : (oclScanLaucher.ofsData[i + 1] - prevChunkVerts);
            if (chunkTotalVerts > 0)
            {
                req.FillOutData(posArray, srcNorm01Array, srcNorm2tArray, prevChunkVerts, chunkTotalVerts);
            }
        }

        lock (_reqFinishedList)
            _reqFinishedList.AddRange(_reqInProcessList);

        _reqInProcessList.Clear();
    }
Exemple #13
0
 public EndUpdateReq(SurfExtractReqMC req)
 {
     _chunk = req._chunk;
     _sig   = req._chunkSig;
     _stamp = req._chunkStamp;
 }
    public void ChunkProcPostGenMesh(IVxSurfExtractReq ireq)
    {
        if (m_MeshMgr == null)
        {
            return;
        }

        SurfExtractReqMC req = ireq as SurfExtractReqMC;

        if (req.IsInvalid)
        {
            Debug.Log("[VCSystem] RemoveChunkInSet" + req._chunk.ChunkPosLod
                      + ":" + req._chunkStamp + "|" + req._chunk.StampOfUpdating);
            return;
        }

        IntVector3 pos = SNChunkPosToChunkPos(new IntVector3(req._chunk.ChunkPosLod.x, req._chunk.ChunkPosLod.y, req._chunk.ChunkPosLod.z));

        int mesh_cnt = req.FillMesh(null);

        m_MeshMgr.Clamp(pos, mesh_cnt);

        int index = 0;

        while (mesh_cnt > 0)
        {
            GameObject targetgo = m_MeshMgr.QueryAtIndex(pos, index);
            if (targetgo == null)
            {
                targetgo = new GameObject();

                // mf
                targetgo.AddComponent <MeshFilter>();

                // mr
                MeshRenderer mr = targetgo.AddComponent <MeshRenderer>();
                mr.material          = m_MeshMgr.m_MeshMat;
                mr.receiveShadows    = true;
                mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.On;

                // mc
                // MeshCollider mc = targetgo.AddComponent<MeshCollider>();
                //mc.sharedMesh = null;

                // pp
                if (!m_ForEditor)
                {
                    VCParticlePlayer pp = targetgo.AddComponent <VCParticlePlayer>();
                    pp.FunctionTag   = VCParticlePlayer.ftDamaged;
                    pp.LocalPosition = Vector3.zero;
                }

                m_MeshMgr.Set(pos, index, targetgo);
            }
            else
            {
                //  MeshCollider mc = targetgo.GetComponent<MeshCollider>();
                //	mc.sharedMesh = null;
            }
            MeshFilter targetmf = targetgo.GetComponent <MeshFilter>();
            Mesh       mesh     = targetmf.mesh;

            mesh.Clear();
            mesh_cnt = req.FillMesh(mesh);

            // Customize mesh for VCSystem
            int       vert_cnt = mesh.vertexCount;
            Color32[] colors   = new Color32[vert_cnt];
            Vector3[] normals  = new Vector3[vert_cnt];
            Vector3[] vertices = mesh.vertices;
            for (int i = 0; i < vert_cnt; ++i)
            {
                colors[i] = VCIsoData.BLANK_COLOR;
            }
            for (int i = 0; i < vertices.Length; i += 3)
            {
                Vector3 normal = Vector3.Cross(vertices[i] - vertices[i + 1], vertices[i] - vertices[i + 2]).normalized;
                normals[i]     = normal;
                normals[i + 1] = normal;
                normals[i + 2] = normal;
            }
            mesh.normals  = normals;
            mesh.colors32 = colors;
            m_MeshMgr.UpdateMeshColor(targetmf);
            PostGenerate(targetmf);
            ++index;
        }
    }