// No config overrides on AlembicPoints
        public override void AbcSampleUpdated(AbcAPI.aiSample sample, bool topologyChanged)
        {
            // get points cloud component
            var cloud = AlembicTreeNode.linkedGameObj.GetComponent <AlembicPointsCloud>() ??
                        AlembicTreeNode.linkedGameObj.AddComponent <AlembicPointsCloud>();


            if (cloud.abcPositions == null)
            {
                AbcAPI.aiPointsGetSummary(m_abcSchema, ref m_summary);
                cloud.m_abcPositions    = new Vector3[m_summary.peakCount];
                cloud.m_abcIDs          = new ulong[m_summary.peakCount];
                cloud.m_peakVertexCount = m_summary.peakCount;
                m_abcData.positions     = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcPositions, 0);
                m_abcData.ids           = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcIDs, 0);
                if (m_summary.hasVelocity)
                {
                    cloud.m_abcVelocities = new Vector3[m_summary.peakCount];
                    m_abcData.velocities  = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcVelocities, 0);
                }
            }

            m_abcData.positions = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcPositions, 0);
            m_abcData.ids       = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcIDs, 0);
            if (m_summary.hasVelocity)
            {
                m_abcData.velocities = Marshal.UnsafeAddrOfPinnedArrayElement(cloud.m_abcVelocities, 0);
            }

            AbcAPI.aiPointsCopyData(sample, ref m_abcData);
            cloud.m_boundsCenter  = m_abcData.boundsCenter;
            cloud.m_boundsExtents = m_abcData.boundsExtents;
            cloud.m_count         = m_abcData.count;

            AbcDirty();
        }
        public override void AbcSampleUpdated(AbcAPI.aiSample sample, bool topologyChanged)
        {
            AbcAPI.aiCameraGetData(sample, ref m_AbcData);

            AbcDirty();
        }
Beispiel #3
0
        public override void AbcSampleUpdated(AbcAPI.aiSample sample, bool topologyChanged)
        {
            var abcMaterials = AlembicTreeNode.linkedGameObj.GetComponent <AlembicMaterial>();

            if (abcMaterials != null)
            {
                if (abcMaterials.HasFacesetsChanged())
                {
                    topologyChanged = true;
                }

                hasFacesets = (abcMaterials.GetFacesetsCount() > 0);
            }
            else if (hasFacesets)
            {
                topologyChanged = true;
                hasFacesets     = false;
            }

            if (m_FreshSetup)
            {
                topologyChanged = true;

                m_FreshSetup = false;
            }

            AbcAPI.aiPolyMeshGetSampleSummary(sample, ref sampleSummary, topologyChanged);

            AbcAPI.aiPolyMeshData vertexData = default(AbcAPI.aiPolyMeshData);

            UpdateSplits(sampleSummary.splitCount);

            for (int s = 0; s < sampleSummary.splitCount; ++s)
            {
                Split split = splits[s];

                split.clear  = topologyChanged;
                split.active = true;

                int vertexCount = AbcAPI.aiPolyMeshGetVertexBufferLength(sample, s);

                Array.Resize(ref split.positionCache, vertexCount);
                vertexData.positions = GetArrayPtr(split.positionCache);

                if (sampleSummary.hasVelocities)
                {
                    Array.Resize(ref split.velocitiesCache, vertexCount);
                    vertexData.velocities = GetArrayPtr(split.velocitiesCache);

                    Array.Resize(ref split.velocitiesXYCache, vertexCount);
                    vertexData.interpolatedVelocitiesXY = GetArrayPtr(split.velocitiesXYCache);

                    Array.Resize(ref split.velocitiesZCache, vertexCount);
                    vertexData.interpolatedVelocitiesZ = GetArrayPtr(split.velocitiesZCache);
                }

                if (sampleSummary.hasNormals)
                {
                    Array.Resize(ref split.normalCache, vertexCount);
                    vertexData.normals = GetArrayPtr(split.normalCache);
                }
                else
                {
                    Array.Resize(ref split.normalCache, 0);
                    vertexData.normals = IntPtr.Zero;
                }

                if (sampleSummary.hasUVs)
                {
                    Array.Resize(ref split.uvCache, vertexCount);
                    vertexData.uvs = GetArrayPtr(split.uvCache);
                }
                else
                {
                    Array.Resize(ref split.uvCache, 0);
                    vertexData.uvs = IntPtr.Zero;
                }

                if (sampleSummary.hasTangents)
                {
                    Array.Resize(ref split.tangentCache, vertexCount);
                    vertexData.tangents = GetArrayPtr(split.tangentCache);
                }
                else
                {
                    Array.Resize(ref split.tangentCache, 0);
                    vertexData.tangents = IntPtr.Zero;
                }

                AbcAPI.aiPolyMeshFillVertexBuffer(sample, s, ref vertexData);

                split.center = vertexData.center;
                split.size   = vertexData.size;
            }

            if (topologyChanged)
            {
                AbcAPI.aiFacesets       facesets       = default(AbcAPI.aiFacesets);
                AbcAPI.aiSubmeshSummary submeshSummary = default(AbcAPI.aiSubmeshSummary);
                AbcAPI.aiSubmeshData    submeshData    = default(AbcAPI.aiSubmeshData);

                if (abcMaterials != null)
                {
                    abcMaterials.GetFacesets(ref facesets);
                }

                int numSubmeshes = AbcAPI.aiPolyMeshPrepareSubmeshes(sample, ref facesets);

                if (submeshes.Count > numSubmeshes)
                {
                    submeshes.RemoveRange(numSubmeshes, submeshes.Count - numSubmeshes);
                }

                for (int s = 0; s < sampleSummary.splitCount; ++s)
                {
                    splits[s].submeshCount = AbcAPI.aiPolyMeshGetSplitSubmeshCount(sample, s);
                }

                while (AbcAPI.aiPolyMeshGetNextSubmesh(sample, ref submeshSummary))
                {
                    if (submeshSummary.splitIndex >= splits.Count)
                    {
                        Debug.Log("Invalid split index");
                        continue;
                    }

                    Submesh submesh = null;

                    if (submeshSummary.index < submeshes.Count)
                    {
                        submesh = submeshes[submeshSummary.index];
                    }
                    else
                    {
                        submesh = new Submesh
                        {
                            indexCache   = new int[0],
                            facesetIndex = -1,
                            splitIndex   = -1,
                            index        = -1,
                            update       = true
                        };

                        submeshes.Add(submesh);
                    }

                    submesh.facesetIndex = submeshSummary.facesetIndex;
                    submesh.splitIndex   = submeshSummary.splitIndex;
                    submesh.index        = submeshSummary.splitSubmeshIndex;
                    submesh.update       = true;

                    Array.Resize(ref submesh.indexCache, 3 * submeshSummary.triangleCount);

                    submeshData.indices = GetArrayPtr(submesh.indexCache);

                    AbcAPI.aiPolyMeshFillSubmeshIndices(sample, ref submeshSummary, ref submeshData);
                }

                if (abcMaterials != null)
                {
                    abcMaterials.AknowledgeFacesetsChanges();
                }
            }
            else
            {
                for (int i = 0; i < submeshes.Count; ++i)
                {
                    submeshes[i].update = false;
                }
            }

            AbcDirty();
        }
Beispiel #4
0
        // No config override

        public override void AbcSampleUpdated(AbcAPI.aiSample sample, bool topologyChanged)
        {
            // ToDo
        }
Beispiel #5
0
 // Called by loading thread (not necessarily the main thread)
 public abstract void AbcSampleUpdated(AbcAPI.aiSample sample, bool topologyChanged);
Beispiel #6
0
        static void SampleCallback(IntPtr __this, AbcAPI.aiSample sample, Bool topologyChanged)
        {
            var _this = GCHandle.FromIntPtr(__this).Target as AlembicElement;

            _this.AbcSampleUpdated(sample, topologyChanged);
        }