/// <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(); }
/// <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); } }