Exemple #1
0
        /// <summary>
        ///    Internal method for building PMWorkingData from geometry data
        /// </summary>
        private void AddWorkingData(VertexData vertexData, IndexData indexData)
        {
            // Insert blank working data, then fill
            var work = new PMWorkingData();

            this.workingDataList.Add(work);

            // Build vertex list
            // Resize face list (this will always be this big)
            work.faceVertList = new PMFaceVertex[vertexData.vertexCount];
            // Also resize common vert list to max, to avoid reallocations
            work.vertList = new PMVertex[vertexData.vertexCount];

            // locate position element & the buffer to go with it
            var posElem = vertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.Position);
            var vbuf    = vertexData.vertexBufferBinding.GetBuffer(posElem.Source);

            // lock the buffer for reading
            var bufPtr = vbuf.Lock(BufferLocking.ReadOnly);

            uint numCommon = 0;

#if !AXIOM_SAFE_ONLY
            unsafe
#endif
            {
                var pVertex = bufPtr;

                Vector3 pos;
                // Map for identifying duplicate position vertices
                var commonVertexMap = new Dictionary <Vector3, uint>();
                for (uint i = 0; i < vertexData.vertexCount; ++i, pVertex += vbuf.VertexSize)
                {
                    var pFloat = (pVertex + posElem.Offset).ToFloatPointer();
                    pos.x = pFloat[0];
                    pos.y = pFloat[1];
                    pos.z = pFloat[2];

                    work.faceVertList[(int)i] = new PMFaceVertex();

                    // Try to find this position in the existing map
                    if (!commonVertexMap.ContainsKey(pos))
                    {
                        // Doesn't exist, so create it
                        var commonVert = new PMVertex();
                        commonVert.SetDetails(pos, numCommon);
                        commonVert.removed     = false;
                        commonVert.toBeRemoved = false;
                        commonVert.seam        = false;
                        // Add it to our working set
                        work.vertList[(int)numCommon] = commonVert;

                        // Enter it in the map
                        commonVertexMap.Add(pos, numCommon);
                        // Increment common index
                        ++numCommon;

                        work.faceVertList[(int)i].commonVertex = commonVert;
                        work.faceVertList[(int)i].realIndex    = i;
                    }
                    else
                    {
                        // Exists already, reference it
                        var existingVert = work.vertList[(int)commonVertexMap[pos]];

                        work.faceVertList[(int)i].commonVertex = existingVert;
                        work.faceVertList[(int)i].realIndex    = i;

                        // Also tag original as a seam since duplicates at this location
                        work.faceVertList[(int)i].commonVertex.seam = true;
                    }
                }
            }
            vbuf.Unlock();

            this.numCommonVertices = numCommon;

            // Build tri list
            var numTris         = (uint)indexData.indexCount / 3;
            var ibuf            = indexData.indexBuffer;
            var use32bitindexes = (ibuf.Type == IndexType.Size32);
            var indexBufferPtr  = ibuf.Lock(BufferLocking.ReadOnly);
#if !AXIOM_SAFE_ONLY
            unsafe
#endif
            {
                var pInt   = indexBufferPtr.ToUIntPointer();
                var pShort = indexBufferPtr.ToUShortPointer();
                var idx    = 0;
                work.triList = new PMTriangle[(int)numTris];                 // assumed tri list
                for (uint i = 0; i < numTris; ++i)
                {
                    // use 32-bit index always since we're not storing
                    var vindex = use32bitindexes ? pInt[idx++] : pShort[idx++];
                    var v0     = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? pInt[idx++] : pShort[idx++];
                    var v1 = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? pInt[idx++] : pShort[idx++];
                    var v2 = work.faceVertList[(int)vindex];

                    work.triList[(int)i] = new PMTriangle();
                    work.triList[(int)i].SetDetails(i, v0, v1, v2);
                    work.triList[(int)i].removed = false;
                }
            }
            ibuf.Unlock();
        }
		/// <summary>
		///    Internal method for building PMWorkingData from geometry data
		/// </summary>
		private void AddWorkingData( VertexData vertexData, IndexData indexData )
		{
			// Insert blank working data, then fill
			var work = new PMWorkingData();
			this.workingDataList.Add( work );

			// Build vertex list
			// Resize face list (this will always be this big)
			work.faceVertList = new PMFaceVertex[vertexData.vertexCount];
			// Also resize common vert list to max, to avoid reallocations
			work.vertList = new PMVertex[vertexData.vertexCount];

			// locate position element & the buffer to go with it
			var posElem = vertexData.vertexDeclaration.FindElementBySemantic( VertexElementSemantic.Position );
			var vbuf = vertexData.vertexBufferBinding.GetBuffer( posElem.Source );

			// lock the buffer for reading
			var bufPtr = vbuf.Lock( BufferLocking.ReadOnly );

			uint numCommon = 0;
#if !AXIOM_SAFE_ONLY
			unsafe
#endif
			{
				var pVertex = bufPtr;

				Vector3 pos;
				// Map for identifying duplicate position vertices
				var commonVertexMap = new Dictionary<Vector3, uint>();
				for ( uint i = 0; i < vertexData.vertexCount; ++i, pVertex += vbuf.VertexSize )
				{
					var pFloat = ( pVertex + posElem.Offset ).ToFloatPointer();
					pos.x = pFloat[ 0 ];
					pos.y = pFloat[ 1 ];
					pos.z = pFloat[ 2 ];

					work.faceVertList[ (int)i ] = new PMFaceVertex();

					// Try to find this position in the existing map 
					if ( !commonVertexMap.ContainsKey( pos ) )
					{
						// Doesn't exist, so create it
						var commonVert = new PMVertex();
						commonVert.SetDetails( pos, numCommon );
						commonVert.removed = false;
						commonVert.toBeRemoved = false;
						commonVert.seam = false;
						// Add it to our working set
						work.vertList[ (int)numCommon ] = commonVert;

						// Enter it in the map
						commonVertexMap.Add( pos, numCommon );
						// Increment common index
						++numCommon;

						work.faceVertList[ (int)i ].commonVertex = commonVert;
						work.faceVertList[ (int)i ].realIndex = i;
					}
					else
					{
						// Exists already, reference it
						var existingVert = work.vertList[ (int)commonVertexMap[ pos ] ];

						work.faceVertList[ (int)i ].commonVertex = existingVert;
						work.faceVertList[ (int)i ].realIndex = i;

						// Also tag original as a seam since duplicates at this location
						work.faceVertList[ (int)i ].commonVertex.seam = true;
					}
				}
			}
			vbuf.Unlock();

			this.numCommonVertices = numCommon;

			// Build tri list
			var numTris = (uint)indexData.indexCount/3;
			var ibuf = indexData.indexBuffer;
			var use32bitindexes = ( ibuf.Type == IndexType.Size32 );
			var indexBufferPtr = ibuf.Lock( BufferLocking.ReadOnly );
#if !AXIOM_SAFE_ONLY
			unsafe
#endif
			{
				var pInt = indexBufferPtr.ToUIntPointer();
				var pShort = indexBufferPtr.ToUShortPointer();
				var idx = 0;
				work.triList = new PMTriangle[(int)numTris]; // assumed tri list
				for ( uint i = 0; i < numTris; ++i )
				{
					// use 32-bit index always since we're not storing
					var vindex = use32bitindexes ? pInt[ idx++ ] : pShort[ idx++ ];
					var v0 = work.faceVertList[ (int)vindex ];
					vindex = use32bitindexes ? pInt[ idx++ ] : pShort[ idx++ ];
					var v1 = work.faceVertList[ (int)vindex ];
					vindex = use32bitindexes ? pInt[ idx++ ] : pShort[ idx++ ];
					var v2 = work.faceVertList[ (int)vindex ];

					work.triList[ (int)i ] = new PMTriangle();
					work.triList[ (int)i ].SetDetails( i, v0, v1, v2 );
					work.triList[ (int)i ].removed = false;
				}
			}
			ibuf.Unlock();
		}
        /// <summary>
        ///    Internal method for building PMWorkingData from geometry data
        /// </summary>
        void AddWorkingData(VertexData vertexData, IndexData indexData)
        {
            // Insert blank working data, then fill
            PMWorkingData work = new PMWorkingData();
            this.workingDataList.Add(work);

            // Build vertex list
            // Resize face list (this will always be this big)
            work.faceVertList = new PMFaceVertex[vertexData.vertexCount];
            // Also resize common vert list to max, to avoid reallocations
            work.vertList = new PMVertex[vertexData.vertexCount];

            // locate position element & the buffer to go with it
            VertexElement posElem =
                vertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.Position);
            HardwareVertexBuffer vbuf =
                vertexData.vertexBufferBinding.GetBuffer(posElem.Source);

            // lock the buffer for reading
            IntPtr bufPtr = vbuf.Lock(BufferLocking.ReadOnly);

            uint numCommon = 0;
            unsafe {
                byte *pVertex = (byte *)bufPtr.ToPointer();

                float* pFloat;
                Vector3 pos;
                // Map for identifying duplicate position vertices
                Dictionary<Vector3, uint> commonVertexMap = new Dictionary<Vector3,uint>();
                for (uint i = 0; i < vertexData.vertexCount; ++i, pVertex += vbuf.VertexSize) {
                    pFloat = (float *)(pVertex + posElem.Offset);
                    pos.x = *pFloat++;
                    pos.y = *pFloat++;
                    pos.z = *pFloat++;

                    work.faceVertList[(int)i] = new PMFaceVertex();

                    // Try to find this position in the existing map
                    if (!commonVertexMap.ContainsKey(pos)) {
                        // Doesn't exist, so create it
                        PMVertex commonVert = new PMVertex();
                        commonVert.SetDetails(pos, numCommon);
                        commonVert.removed = false;
                        commonVert.toBeRemoved = false;
                        commonVert.seam = false;
                        // Add it to our working set
                        work.vertList[(int)numCommon] = commonVert;

                        // Enter it in the map
                        commonVertexMap.Add(pos, numCommon);
                        // Increment common index
                        ++numCommon;

                        work.faceVertList[(int)i].commonVertex = commonVert;
                        work.faceVertList[(int)i].realIndex = i;
                    }
                    else
                    {
                        // Exists already, reference it
                        PMVertex existingVert = work.vertList[(int)commonVertexMap[pos]];

                        work.faceVertList[(int)i].commonVertex = existingVert;
                        work.faceVertList[(int)i].realIndex = i;

                        // Also tag original as a seam since duplicates at this location
                        work.faceVertList[(int)i].commonVertex.seam = true;
                    }
                }
            }
            vbuf.Unlock();

            numCommonVertices = numCommon;

            // Build tri list
            uint numTris = (uint)indexData.indexCount / 3;
            HardwareIndexBuffer ibuf = indexData.indexBuffer;
            bool use32bitindexes = (ibuf.Type == IndexType.Size32);
            IntPtr indexBufferPtr = ibuf.Lock(BufferLocking.ReadOnly);
            unsafe {
                ushort* pShort = null;
                uint* pInt = null;

                if (use32bitindexes)
                {
                    pInt = (uint *)indexBufferPtr.ToPointer();
                }
                else
                {
                    pShort = (ushort *)indexBufferPtr.ToPointer();
                }
                work.triList = new PMTriangle[(int)numTris]; // assumed tri list
                for (uint i = 0; i < numTris; ++i)
                {
                    // use 32-bit index always since we're not storing
                    uint vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v0 = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v1 = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v2 = work.faceVertList[(int)vindex];

                    work.triList[(int)i] = new PMTriangle();
                    work.triList[(int)i].SetDetails(i, v0, v1, v2);
                    work.triList[(int)i].removed = false;
                }
            }
            ibuf.Unlock();
        }
        /// <summary>
        ///    Internal method for building PMWorkingData from geometry data
        /// </summary>
        void AddWorkingData(VertexData vertexData, IndexData indexData)
        {
            // Insert blank working data, then fill
            PMWorkingData work = new PMWorkingData();

            this.workingDataList.Add(work);

            // Build vertex list
            // Resize face list (this will always be this big)
            work.faceVertList = new PMFaceVertex[vertexData.vertexCount];
            // Also resize common vert list to max, to avoid reallocations
            work.vertList = new PMVertex[vertexData.vertexCount];

            // locate position element & the buffer to go with it
            VertexElement posElem =
                vertexData.vertexDeclaration.FindElementBySemantic(VertexElementSemantic.Position);
            HardwareVertexBuffer vbuf =
                vertexData.vertexBufferBinding.GetBuffer(posElem.Source);

            // lock the buffer for reading
            IntPtr bufPtr = vbuf.Lock(BufferLocking.ReadOnly);

            uint numCommon = 0;

            unsafe {
                byte *pVertex = (byte *)bufPtr.ToPointer();

                float * pFloat;
                Vector3 pos;
                // Map for identifying duplicate position vertices
                Dictionary <Vector3, uint> commonVertexMap = new Dictionary <Vector3, uint>();
                for (uint i = 0; i < vertexData.vertexCount; ++i, pVertex += vbuf.VertexSize)
                {
                    pFloat = (float *)(pVertex + posElem.Offset);
                    pos.x  = *pFloat++;
                    pos.y  = *pFloat++;
                    pos.z  = *pFloat++;

                    work.faceVertList[(int)i] = new PMFaceVertex();

                    // Try to find this position in the existing map
                    if (!commonVertexMap.ContainsKey(pos))
                    {
                        // Doesn't exist, so create it
                        PMVertex commonVert = new PMVertex();
                        commonVert.SetDetails(pos, numCommon);
                        commonVert.removed     = false;
                        commonVert.toBeRemoved = false;
                        commonVert.seam        = false;
                        // Add it to our working set
                        work.vertList[(int)numCommon] = commonVert;

                        // Enter it in the map
                        commonVertexMap.Add(pos, numCommon);
                        // Increment common index
                        ++numCommon;

                        work.faceVertList[(int)i].commonVertex = commonVert;
                        work.faceVertList[(int)i].realIndex    = i;
                    }
                    else
                    {
                        // Exists already, reference it
                        PMVertex existingVert = work.vertList[(int)commonVertexMap[pos]];

                        work.faceVertList[(int)i].commonVertex = existingVert;
                        work.faceVertList[(int)i].realIndex    = i;

                        // Also tag original as a seam since duplicates at this location
                        work.faceVertList[(int)i].commonVertex.seam = true;
                    }
                }
            }
            vbuf.Unlock();

            numCommonVertices = numCommon;

            // Build tri list
            uint numTris             = (uint)indexData.indexCount / 3;
            HardwareIndexBuffer ibuf = indexData.indexBuffer;
            bool   use32bitindexes   = (ibuf.Type == IndexType.Size32);
            IntPtr indexBufferPtr    = ibuf.Lock(BufferLocking.ReadOnly);

            unsafe {
                ushort *pShort = null;
                uint *  pInt   = null;

                if (use32bitindexes)
                {
                    pInt = (uint *)indexBufferPtr.ToPointer();
                }
                else
                {
                    pShort = (ushort *)indexBufferPtr.ToPointer();
                }
                work.triList = new PMTriangle[(int)numTris]; // assumed tri list
                for (uint i = 0; i < numTris; ++i)
                {
                    // use 32-bit index always since we're not storing
                    uint         vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v0     = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v1 = work.faceVertList[(int)vindex];
                    vindex = use32bitindexes ? *pInt++ : *pShort++;
                    PMFaceVertex v2 = work.faceVertList[(int)vindex];

                    work.triList[(int)i] = new PMTriangle();
                    work.triList[(int)i].SetDetails(i, v0, v1, v2);
                    work.triList[(int)i].removed = false;
                }
            }
            ibuf.Unlock();
        }