Beispiel #1
0
        private unsafe int ReadIndexData(int indexOffset, uint vertexOffset, IndexData indexData)
        {
            // get index data
            HardwareIndexBufferSharedPtr indexBuf = indexData.indexBuffer;

            HardwareIndexBuffer.IndexType indexType = indexBuf.Type;
            uint *  pLong  = (uint *)(indexBuf.Lock(HardwareBuffer.LockOptions.HBL_READ_ONLY));
            ushort *pShort = (ushort *)pLong;

            for (uint i = 0; i < indexData.indexCount; i++)
            {
                if (indexType == HardwareIndexBuffer.IndexType.IT_32BIT)
                {
                    _indices[indexOffset] = pLong[i] + vertexOffset;
                }
                else
                {
                    _indices[indexOffset] = pShort[i] + vertexOffset;
                }

                indexOffset++;
            }

            indexBuf.Unlock();
            // SGD :2013/6/8 13:42:42
            // 说明:销毁指针引用  防止.NET回收
            indexBuf.Dispose();
            return(indexOffset);
        }
Beispiel #2
0
 public HardwareIndexBuffer.IndexType getType()
 {
     HardwareIndexBuffer.IndexType ret = (HardwareIndexBuffer.IndexType)OgrePINVOKE.HardwareIndexBuffer_getType(swigCPtr);
     if (OgrePINVOKE.SWIGPendingException.Pending)
     {
         throw OgrePINVOKE.SWIGPendingException.Retrieve();
     }
     return(ret);
 }
Beispiel #3
0
        public virtual HardwareIndexBufferPtr createIndexBuffer(HardwareIndexBuffer.IndexType itype, uint numIndexes, HardwareBuffer.Usage usage)
        {
            HardwareIndexBufferPtr ret = new HardwareIndexBufferPtr(OgrePINVOKE.HardwareBufferManagerBase_createIndexBuffer__SWIG_1(swigCPtr, (int)itype, numIndexes, (int)usage), true);

            if (OgrePINVOKE.SWIGPendingException.Pending)
            {
                throw OgrePINVOKE.SWIGPendingException.Retrieve();
            }
            return(ret);
        }
Beispiel #4
0
        public virtual void CreateIndexBuffer(uint triaglecount,
                                              HardwareIndexBuffer.IndexType itype,
                                              HardwareBuffer.Usage usage,
                                              bool useShadowBuffer)
        {
            mvbuf.Unlock();
            mTriagleCount = triaglecount;
            mIndexType    = itype;
            mSubMesh.vertexData.vertexBufferBinding.SetBinding(0, mvbuf);
            mSubMesh.indexData.indexCount = mTriagleCount * 3;
            HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager.Singleton
                                                .CreateIndexBuffer(mIndexType, mTriagleCount * 3, usage, useShadowBuffer);

            mSubMesh.indexData.indexBuffer = ibuf;
            unsafe
            {
                pIBuffStart = ibuf.Lock(HardwareBuffer.LockOptions.HBL_DISCARD);
            }
        }
Beispiel #5
0
        public virtual void CreateIndexBufferForTriStrip(uint indexcount,
                                                         HardwareIndexBuffer.IndexType itype,
                                                         HardwareBuffer.Usage usage)
        {
            mvbuf.Unlock();
            mTriagleCount = 0;
            mIndexType    = itype;
            mSubMesh.vertexData.vertexBufferBinding.SetBinding(0, mvbuf);
            mSubMesh.indexData.indexCount = indexcount;
            HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager.Singleton
                                                .CreateIndexBuffer(mIndexType, indexcount, usage, false);

            mSubMesh.indexData.indexBuffer = ibuf;
            mSubMesh.operationType         = RenderOperation.OperationTypes.OT_TRIANGLE_STRIP;
            unsafe
            {
                pIBuffStart   = ibuf.Lock(HardwareBuffer.LockOptions.HBL_DISCARD);
                pIBuffLastPos = pIBuffStart;
            }
        }
Beispiel #6
0
        public MeshBuilderHelper(String name, String resourcegroup,
            bool usesharedvertices, uint vertexstart, uint vertexcount)
        {
            mName = name;
            mResourceGroup = resourcegroup;
            mVertextStart = vertexstart;
            mVertexCount = vertexcount;

            if (MeshManager.Singleton.ResourceExists(name))
                throw (new ArgumentNullException("mesh name already used"));

            mMeshPtr = MeshManager.Singleton.CreateManual(mName, mResourceGroup);
            mSubMesh = mMeshPtr.CreateSubMesh();
            mSubMesh.useSharedVertices = usesharedvertices;
            mSubMesh.vertexData = new VertexData();
            mSubMesh.vertexData.vertexStart = mVertextStart;
            mSubMesh.vertexData.vertexCount = mVertexCount;
            offset = 0;
            mIndexType = HardwareIndexBuffer.IndexType.IT_16BIT;
        }
Beispiel #7
0
    /**************** New Functions Begin ***************/
    /// <summary>
    /// Generate navmesh by entity
    /// </summary>
    /// <param name="ent">Ogre Entity</param>
    /// <returns>Navmesh</returns>

    public static Navmesh LoadNavmesh(Entity ent)
    {
        bool addedSharedVertex = false;

        vertices.Clear();
        faces.Clear();
        MeshPtr mesh = ent.GetMesh();

        Mesh.SubMeshIterator subIterator = mesh.GetSubMeshIterator();

        uint vertexNum    = 0;
        uint vertexOffset = mesh.sharedVertexData.vertexStart;

        MyVector3 <float>[]           verticeArray = new MyVector3 <float> [vertexNum];
        VertexElement                 posElem      = mesh.sharedVertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.VES_POSITION);
        HardwareVertexBufferSharedPtr vertexBuffer = mesh.sharedVertexData.vertexBufferBinding.GetBuffer(posElem.Source);

        while (subIterator.MoveNext())
        {
            SubMesh subMesh = subIterator.Current;

            VertexData vertexData = subMesh.useSharedVertices ? mesh.sharedVertexData : subMesh.vertexData;

            HardwareIndexBufferSharedPtr  indexBuffer = subMesh.indexData.indexBuffer;
            HardwareIndexBuffer.IndexType indexType   = indexBuffer.Type;
            uint indexCount = subMesh.indexData.indexCount;

            uint trisNum = indexCount / 3;

            uint[] indcies     = new uint[indexCount];
            uint   indexOffset = subMesh.indexData.indexStart;

            if (subMesh.useSharedVertices)
            {
                if (!addedSharedVertex)
                {
                    vertexNum        += mesh.sharedVertexData.vertexCount;
                    addedSharedVertex = true;
                }
            }
            else
            {
                vertexNum += subMesh.vertexData.vertexCount;
            }

            unsafe
            {
                uint *  pLong  = (uint *)(indexBuffer.Lock(HardwareBuffer.LockOptions.HBL_READ_ONLY));
                ushort *pShort = (ushort *)pLong;
                for (int i = 0; i < indexCount; i++)
                {
                    if (indexType == HardwareIndexBuffer.IndexType.IT_32BIT)
                    {
                        indcies[indexOffset] = pLong[i] + vertexNum;
                    }
                    else
                    {
                        indcies[indexOffset] = pShort[i] + vertexNum;
                    }
                    indexOffset++;
                }
            }

            int indexLength = indcies.Length / 3;
            for (int i = 0; i < indexLength; i++)
            {
                faces.Add(new MyVector3 <ushort>(
                              (ushort)indcies[i * 3 + 0],
                              (ushort)indcies[i * 3 + 1],
                              (ushort)indcies[i * 3 + 2]
                              ));
            }

            indexBuffer.Unlock();

            if (subMesh.vertexData != null)
            {
                vertexNum    = subMesh.vertexData.vertexCount;
                vertexOffset = subMesh.vertexData.vertexStart;
                verticeArray = new MyVector3 <float> [vertexNum];
                posElem      = subMesh.vertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.VES_POSITION);
                vertexBuffer = subMesh.vertexData.vertexBufferBinding.GetBuffer(posElem.Source);
                unsafe
                {
                    byte * vertexMemory = (byte *)vertexBuffer.Lock(HardwareBuffer.LockOptions.HBL_READ_ONLY);
                    float *pVertexBuffer;
                    for (int i = 0; i < vertexNum; i++)
                    {
                        posElem.BaseVertexPointerToElement(vertexMemory, &pVertexBuffer);
                        verticeArray[vertexOffset] = (new MyVector3 <float>(
                                                          pVertexBuffer[0],
                                                          pVertexBuffer[1],
                                                          pVertexBuffer[2]
                                                          ));
                        vertexMemory += vertexBuffer.VertexSize;
                        vertexOffset++;
                    }
                }
                for (int i = 0; i < verticeArray.Length; i++)
                {
                    vertices.Add(verticeArray[i]);
                }
                vertexBuffer.Unlock();
            }
        }

        vertexNum    = mesh.sharedVertexData.vertexCount;
        vertexOffset = mesh.sharedVertexData.vertexStart;
        verticeArray = new MyVector3 <float> [vertexNum];
        posElem      = mesh.sharedVertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.VES_POSITION);
        vertexBuffer = mesh.sharedVertexData.vertexBufferBinding.GetBuffer(posElem.Source);

        unsafe
        {
            byte * vertexMemory = (byte *)vertexBuffer.Lock(HardwareBuffer.LockOptions.HBL_READ_ONLY);
            float *pVertexBuffer;
            for (int i = 0; i < vertexNum; i++)
            {
                posElem.BaseVertexPointerToElement(vertexMemory, &pVertexBuffer);
                verticeArray[vertexOffset] = (new MyVector3 <float>(
                                                  pVertexBuffer[0],
                                                  pVertexBuffer[1],
                                                  pVertexBuffer[2]
                                                  ));
                vertexMemory += vertexBuffer.VertexSize;
                vertexOffset++;
            }
        }
        for (int i = 0; i < verticeArray.Length; i++)
        {
            vertices.Add(verticeArray[i]);
        }
        vertexBuffer.Unlock();

        return(GenerateNavmesh());
    }
Beispiel #8
0
 public virtual void CreateIndexBuffer(uint triaglecount,
                                       HardwareIndexBuffer.IndexType itype,
                                       HardwareBuffer.Usage usage)
 {
     CreateIndexBuffer(triaglecount, itype, usage, false);
 }
Beispiel #9
0
 public virtual void CreateIndexBuffer(uint triaglecount,
     HardwareIndexBuffer.IndexType itype,
     HardwareBuffer.Usage usage,
     bool useShadowBuffer)
 {
     mvbuf.Unlock();
     mTriagleCount = triaglecount;
     mIndexType = itype;
     mSubMesh.vertexData.vertexBufferBinding.SetBinding(0, mvbuf);
     mSubMesh.indexData.indexCount = mTriagleCount * 3;
     HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager.Singleton
         .CreateIndexBuffer(mIndexType, mTriagleCount * 3, usage, useShadowBuffer);
     mSubMesh.indexData.indexBuffer = ibuf;
     unsafe
     {
         pIBuffStart = ibuf.Lock(HardwareBuffer.LockOptions.HBL_DISCARD);
         pIBuffLastPos = pIBuffStart;
     }
 }
Beispiel #10
0
 public virtual void CreateIndexBufferForTriStrip(uint indexcount,
     HardwareIndexBuffer.IndexType itype,
     HardwareBuffer.Usage usage)
 {
     mvbuf.Unlock();
     mTriagleCount = 0;
     mIndexType = itype;
     mSubMesh.vertexData.vertexBufferBinding.SetBinding(0, mvbuf);
     mSubMesh.indexData.indexCount = indexcount;
     HardwareIndexBufferSharedPtr ibuf = HardwareBufferManager.Singleton
         .CreateIndexBuffer(mIndexType, indexcount, usage, false);
     mSubMesh.indexData.indexBuffer = ibuf;
     mSubMesh.operationType = RenderOperation.OperationTypes.OT_TRIANGLE_STRIP;
     unsafe
     {
         pIBuffStart = ibuf.Lock(HardwareBuffer.LockOptions.HBL_DISCARD);
         pIBuffLastPos = pIBuffStart;
     }
 }