コード例 #1
0
ファイル: Embree.cs プロジェクト: Zheltov/Illuminarium
        /// <summary>
        /// Commits all current instances to the scene.
        /// </summary>
        public void Commit()
        {
            foreach (var entry in instances)
            {
                var instance = entry.Value;
                instance.Geometry.Commit();

                var xtf = new float[12] // Column-major order
                {
                    instance.Transform.U.X, instance.Transform.U.Y, instance.Transform.U.Z,
                    instance.Transform.V.X, instance.Transform.V.Y, instance.Transform.V.Z,
                    instance.Transform.W.X, instance.Transform.W.Y, instance.Transform.W.Z,
                    instance.Transform.T.X, instance.Transform.T.Y, instance.Transform.T.Z
                };

                var pinned = GCHandle.Alloc(xtf, GCHandleType.Pinned); // Pin transform matrix to raw float* array
                RTC.SetTransform(scenePtr, entry.Key, RTC.MatrixLayout.ColumnMajor, pinned.AddrOfPinnedObject());
                pinned.Free();                                         // Release before checking for error
                RTC.CheckLastError();

                if (instance.Enabled)
                {
                    RTC.EnableGeometry(scenePtr, entry.Key);
                }
                else
                {
                    RTC.DisableGeometry(scenePtr, entry.Key);
                }

                RTC.CheckLastError();

                if (sceneFlags.HasFlag(SceneFlags.Dynamic))
                {
                    RTC.UpdateGeometry(scenePtr, entry.Key);
                    RTC.CheckLastError(); // static mesh?
                }
            }

            RTC.Commit(scenePtr);
            RTC.CheckLastError();
        }
コード例 #2
0
        /// <summary>
        /// Sets the transformation matrix for this instance.
        /// </summary>
        /// <param name="transform">The transformation matrix entries.</param>
        /// <param name="layout">The layout of the matrix entries.</param>
        /// <remarks>
        /// Only the first 12 or 16 entries of the transform array are used.
        /// </remarks>
        /// <remarks>
        /// The transform should be uniform, i.e. no non-uniform scaling.
        /// </remarks>
        public unsafe void SetTransform(float[] transform, MatrixLayout layout)
        {
            if (transform == null)
            {
                throw new ArgumentNullException("transform");
            }

            switch (layout)
            {
            case MatrixLayout.ColumnMajorAligned16:
                if (transform.Length < 16)
                {
                    throw new ArgumentException("transform");
                }
                else
                {
                    break;
                }

            case MatrixLayout.ColumnMajor:
            case MatrixLayout.RowMajor:
                if (transform.Length < 12)
                {
                    throw new ArgumentException("transform");
                }
                else
                {
                    break;
                }

            default:
                throw new ArgumentException("layout");
            }

            fixed(float *xfm = transform)
            {
                RTC.SetTransform(Parent.NativePtr, ID, layout, xfm);
            }
        }