(field, value, floatView, dataView, baseOffset)
| 2075 | // |
| 2076 | // value: number or number[] - the data to write |
| 2077 | _packField(field, value, floatView, dataView, baseOffset) { |
| 2078 | if (value === undefined) return; |
| 2079 | |
| 2080 | // Duck typing instead of instanceof to avoid importing a separate |
| 2081 | // copy of the Color/Vector classes |
| 2082 | if (value?.isVector) { |
| 2083 | value = value.values.length !== value.dimensions ? value.values.slice(0, value.dimensions) : value.values; |
| 2084 | } else if (value?.isColor) { |
| 2085 | value = value._getRGBA([1, 1, 1, 1]); |
| 2086 | } |
| 2087 | const byteOffset = baseOffset + field.offset; |
| 2088 | if (field.baseType === 'u32') { |
| 2089 | if (field.size === 4) { |
| 2090 | dataView.setUint32(byteOffset, value, true); |
| 2091 | } else { |
| 2092 | for (let i = 0; i < value.length; i++) { |
| 2093 | dataView.setUint32(byteOffset + i * 4, value[i], true); |
| 2094 | } |
| 2095 | } |
| 2096 | } else if (field.baseType === 'i32') { |
| 2097 | if (field.size === 4) { |
| 2098 | dataView.setInt32(byteOffset, value, true); |
| 2099 | } else { |
| 2100 | for (let i = 0; i < value.length; i++) { |
| 2101 | dataView.setInt32(byteOffset + i * 4, value[i], true); |
| 2102 | } |
| 2103 | } |
| 2104 | } else if (field.packInPlace) { |
| 2105 | // In-place packing for mat3: write directly to buffer with padding |
| 2106 | const base = byteOffset / 4; |
| 2107 | floatView[base + 0] = value[0]; floatView[base + 1] = value[1]; floatView[base + 2] = value[2]; |
| 2108 | floatView[base + 4] = value[3]; floatView[base + 5] = value[4]; floatView[base + 6] = value[5]; |
| 2109 | floatView[base + 8] = value[6]; floatView[base + 9] = value[7]; floatView[base + 10] = value[8]; |
| 2110 | } else if (field.size === 4) { |
| 2111 | floatView.set([value], byteOffset / 4); |
| 2112 | } else { |
| 2113 | floatView.set(value, byteOffset / 4); |
| 2114 | } |
| 2115 | } |
| 2116 | |
| 2117 | _packUniformGroup(shader, groupUniforms, bufferInfo) { |
| 2118 | // Pack a single group's uniforms into a buffer |
no test coverage detected