|
@@ -10,6 +10,7 @@ import { fillSerial } from 'mol-util/array';
|
|
|
|
|
|
export type TransformData = {
|
|
|
aTransform: ValueCell<Float32Array>,
|
|
|
+ transform: ValueCell<Float32Array>,
|
|
|
uInstanceCount: ValueCell<number>,
|
|
|
instanceCount: ValueCell<number>,
|
|
|
aInstance: ValueCell<Float32Array>,
|
|
@@ -26,6 +27,7 @@ export function createTransform(transformArray: Float32Array, instanceCount: num
|
|
|
} else {
|
|
|
return {
|
|
|
aTransform: ValueCell.create(transformArray),
|
|
|
+ transform: ValueCell.create(new Float32Array(transformArray)),
|
|
|
uInstanceCount: ValueCell.create(instanceCount),
|
|
|
instanceCount: ValueCell.create(instanceCount),
|
|
|
aInstance: ValueCell.create(fillSerial(new Float32Array(instanceCount)))
|
|
@@ -37,4 +39,17 @@ const identityTransform = new Float32Array(16)
|
|
|
Mat4.toArray(Mat4.identity(), identityTransform, 0)
|
|
|
export function createIdentityTransform(transformData?: TransformData): TransformData {
|
|
|
return createTransform(identityTransform, 1, transformData)
|
|
|
+}
|
|
|
+
|
|
|
+const tmpTransformMat4 = Mat4.identity()
|
|
|
+export function setTransform(matrix: Mat4, transformData: TransformData) {
|
|
|
+ const instanceCount = transformData.instanceCount.ref.value
|
|
|
+ const transform = transformData.transform.ref.value
|
|
|
+ const aTransform = transformData.aTransform.ref.value
|
|
|
+ for (let i = 0; i < instanceCount; i++) {
|
|
|
+ Mat4.fromArray(tmpTransformMat4, transform, i * 16)
|
|
|
+ Mat4.mul(tmpTransformMat4, tmpTransformMat4, matrix)
|
|
|
+ Mat4.toArray(tmpTransformMat4, aTransform, i * 16)
|
|
|
+ }
|
|
|
+ ValueCell.update(transformData.aTransform, aTransform)
|
|
|
}
|