예제 #1
0
    public void ChunkProcPostGenMesh(IVxSurfExtractReq ireq)
    {
        SurfExtractReqB45 req   = ireq as SurfExtractReqB45;
        Block45ChunkGo    b45Go = Block45ChunkGo.CreateChunkGo(req);

        req._chunkData.AttachChunkGo(b45Go);
    }
예제 #2
0
    public static Block45ChunkGo CreateChunkGo(IVxSurfExtractReq req, Transform parent = null)
    {
        if (req.FillMesh(null) == 0)
        {
            return(null);
        }

        Block45ChunkGo b45Go = VFGoPool <Block45ChunkGo> .GetGo();

        req.FillMesh(b45Go._mf.mesh);

        // set material
        SurfExtractReqB45 b45ret = req as SurfExtractReqB45;

        if (b45ret != null)
        {
            List <Material> tmpMatList = new List <Material>();
            for (int i = 0; i < b45ret.matCnt; i++)
            {
                tmpMatList.Add(_defMats[b45ret.materialMap[i]]);
            }
            b45Go._mr.sharedMaterials = tmpMatList.ToArray();
        }
        if (parent != null)
        {
            b45Go.transform.parent = parent;
        }
        b45Go.gameObject.SetActive(true);
        return(b45Go);
    }
예제 #3
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
    }
    IVxSurfExtractReq PickReqToProceed()
    {
        if (_reqList.Count == 0)
        {
            return(null);
        }

        // Remove those out of date.
        foreach (var entry in _reqList.Where(kvp => kvp.Value.IsInvalid).ToList())
        {
            _reqList.Remove(entry.Key);
        }

        // TODO : mod code for b45
        // Add to process
        for (int curlod = 0; curlod <= LODOctreeMan.MaxLod; curlod++)
        {
            foreach (KeyValuePair <int, IVxSurfExtractReq> pair in _reqList)
            {
                if (pair.Value.Priority == curlod)
                {
                    IVxSurfExtractReq req = pair.Value;
                    Array.Copy(req.VolumeData, _chunkDataBuffer, _chunkDataBuffer.Length);
                    _chunkDataToProceed = _chunkDataBuffer;
                    _reqList.Remove(pair.Key);
                    return(req);
                }
            }
        }
        return(null);
    }
예제 #5
0
    void PickReqToProceed()
    {
        if (_reqList.Count == 0)
        {
            return;
        }

        // Remove those out of date.
        foreach (var entry in _reqList.Where(kvp => kvp.Value.IsInvalid).ToList())
        {
            //SurfExtractReqMC r = (SurfExtractReqMC)entry.Value;
            //Debug.LogError("[RemoveChunkInReq]"+r._chunk.ChunkPosLod+":"
            //                                      +r._chunkSig+"|"+r._chunk.SigOfChnk+";"
            //									+r._chunkStamp+"|"+r._chunk.StampOfUpdating);
            _reqList.Remove(entry.Key);
        }

        // Add to processList
        _tmpReqList.Clear();
        for (int curlod = 0; curlod <= LODOctreeMan.MaxLod && _tmpReqList.Count < oclMarchingCube.MAX_CHUNKS - 1; curlod++)
        {
            _tmpReqList.AddRange(_reqList.Where(kvp => kvp.Value.Priority == curlod));
        }
        int n = 0, nMax = _tmpReqList.Count;

        while (oclMarchingCube.numChunks < oclMarchingCube.MAX_CHUNKS - 1 && n < nMax)
        {
            IVxSurfExtractReq req = _tmpReqList[n].Value;
            _reqInProcessList.Add(req);
            oclMarchingCube.AddChunkVolumeData(req.VolumeData);
            _reqList.Remove(_tmpReqList[n].Key);
            n++;
        }
        return;
    }
예제 #6
0
    IVxSurfExtractReq PickReqToProceed()
    {
        if (_reqList.Count == 0)
        {
            return(null);
        }

        // Remove those out of date.
        foreach (var entry in _reqList.Where(kvp => kvp.Value.IsInvalid).ToList())
        {
            //Debug.Log("RemoveChunkInReq"+((SurfExtractReqMC)entry.Value)._chunkData.ChunkPosLod+":"
            //          +((SurfExtractReqMC)entry.Value)._chunkStamp+"|"
            //          +((SurfExtractReqMC)entry.Value)._chunkData.StampOfChnkUpdating);
            _reqList.Remove(entry.Key);
        }

        // Add to process
        for (int curlod = 0; curlod <= LODOctreeMan.MaxLod; curlod++)
        {
            foreach (KeyValuePair <int, IVxSurfExtractReq> pair in _reqList)
            {
                if (pair.Value.Priority == curlod)
                {
                    IVxSurfExtractReq req = pair.Value;
                    Array.Copy(req.VolumeData, _chunkDataBuffer, _chunkDataBuffer.Length);
                    _chunkDataToProceed = _chunkDataBuffer;
                    _reqList.Remove(pair.Key);
                    return(req);
                }
            }
        }
        return(null);
    }
예제 #7
0
    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;
    }
예제 #8
0
    public bool AddSurfExtractReq(IVxSurfExtractReq req)
    {
        lock (_reqList){
            _reqList[req.Signature] = req;
        }

        return(true);
    }
예제 #9
0
    void ChunkProcPostGenMesh(IVxSurfExtractReq ireq)
    {
        if (this == null)
        {
            return;
        }
        SurfExtractReqB45 req   = ireq as SurfExtractReqB45;
        Block45ChunkGo    b45Go = Block45ChunkGo.CreateChunkGo(req, transform);

        req._chunkData.AttachChunkGo(b45Go);
    }
예제 #10
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);
    }
예제 #11
0
 public IVxSurfExtractReq Contains(VFVoxelChunkData chunk)
 {
     lock (_reqList){
         List <IVxSurfExtractReq> rs  = _reqList.Values.ToList();
         IVxSurfExtractReq        ret = rs.Find(r => ((SurfExtractReqMC)r)._chunk == chunk);
         if (ret == null)
         {
             ret = rs.Find(r => ((SurfExtractReqMC)r)._chunk.ChunkPosLod.Equals(chunk.ChunkPosLod));
             if (ret == null)
             {
                 _reqList.TryGetValue(chunk.SigOfChnk, out ret);
             }
         }
         return(ret);
     }
 }
예제 #12
0
    public static VFVoxelChunkGo CreateChunkGo(IVxSurfExtractReq req, Material mat = null, int layer = 0)
    {
        if (req.FillMesh(null) == 0)
        {
            return(null);
        }

        VFVoxelChunkGo vfGo = VFGoPool <VFVoxelChunkGo> .GetGo();

        int nMesh = req.FillMesh(vfGo.Mf.sharedMesh);

        vfGo._bPrimal = true;
        if (mat != null)
        {
            vfGo.Mr.sharedMaterial = mat;
        }
        if (layer != 0)
        {
            vfGo.gameObject.layer = layer;
        }
        vfGo.gameObject.SetActive(true);

        while (nMesh > 0)
        {
            VFVoxelChunkGo subGo = VFGoPool <VFVoxelChunkGo> .GetGo();

            nMesh = req.FillMesh(subGo.Mf.sharedMesh);
            subGo.transform.parent        = vfGo.transform;
            subGo.transform.localScale    = Vector3.one;
            subGo.transform.localPosition = Vector3.zero;
            if (mat != null)
            {
                subGo.Mr.sharedMaterial = mat;
            }
            if (layer != 0)
            {
                subGo.gameObject.layer = layer;
            }
            subGo.gameObject.SetActive(true);
        }

        return(vfGo);
    }
예제 #13
0
    public void Exec()
    {
        reqToProceed = null;
        lock (_reqList)
            reqToProceed = PickReqToProceed();
        if (reqToProceed == null)
        {
            return;
        }

        swBlock45.setInputChunkData(_chunkDataToProceed);
        swBlock45.Rebuild();

        SurfExtractReqB45 req = reqToProceed as SurfExtractReqB45;
        //usedMaterialIndicesList.Add(swBlock45.getMaterialMap());

        int chunkTotalVerts = swBlock45.verts.Count;

        if (chunkTotalVerts > 0)
        {
            int chunkVertsCntThreshold = reqToProceed.MeshSplitThreshold;
            if (chunkTotalVerts <= chunkVertsCntThreshold)
            {
                req.verts       = swBlock45.verts.ToArray();
                req.uvs         = swBlock45.uvs.ToArray();
                req.matCnt      = swBlock45.matCnt;
                req.materialMap = swBlock45.materialMap;
                foreach (List <int> indice in swBlock45.subMeshIndices)
                {
                    req.subMeshIndices.Add(indice.ToArray());
                }
            }
            else
            {
                Debug.LogError("[SurfB45_CPU]:Out Of chunkVertsCntThreshold.");
            }
        }

        lock (_reqFinishedList)
            _reqFinishedList.Add(reqToProceed);
        _chunkDataToProceed = null;
    }
예제 #14
0
    public void SetTransGo(IVxSurfExtractReq req, int faceMask)
    {
        if (TransvoxelGo != null)
        {
            VFGoPool <VFTransVoxelGo> .FreeGo(TransvoxelGo);

            TransvoxelGo = null;
        }
        if (faceMask != 0)
        {
            VFTransVoxelGo go = VFGoPool <VFTransVoxelGo> .GetGo();

            req.FillMesh(go._mf.sharedMesh);
            go._faceMask        = faceMask;
            go.transform.parent = transform;
            //go.transform.localScale = Vector3.one;
            go.transform.localPosition = Vector3.zero;
            go.gameObject.SetActive(true);
            TransvoxelGo = go;
        }
    }
예제 #15
0
    //private bool bNeedUpdateTrans = false;
    public int  OnFin()
    {
                #if !B45_THREADING
        if (_reqList.Count > 0 && !Pause)
        {
            Exec();
        }
                #endif

        if (Monitor.TryEnter(_reqFinishedList))
        {
            for (int i = 0; i < _reqFinishedList.Count; i++)
            {
                IVxSurfExtractReq req = _reqFinishedList [i];
                req.OnReqFinished();
            }
            _reqFinishedList.Clear();
            Monitor.Exit(_reqFinishedList);
        }

        return(_reqFinishedList.Count);
    }
예제 #16
0
 public bool AddSurfExtractReq(IVxSurfExtractReq req)
 {
     return(true);
 }
예제 #17
0
 public bool AddSurfExtractReq(IVxSurfExtractReq req)
 {
     _reqList[req.Signature] = (SurfExtractReqTrans)req;
     return(true);
 }
예제 #18
0
    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;
        }
    }
예제 #19
0
 private void Recover()
 {
     //if(reqToProceed != null)	AddSurfExtractReq(reqToProceed);
     reqToProceed = null;
 }