@driftengine/core 4.10.0 → 4.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.json +107 -0
- package/README.md +1 -1
- package/dist/index.d.ts +6 -5
- package/dist/index.js +2 -2
- package/dist/render/ambientOcclusionPass.d.ts +3 -2
- package/dist/render/ambientOcclusionPass.js +4 -2
- package/dist/render/backend/api.d.ts +21 -1
- package/dist/render/backend/webgl2/renderer.d.ts +141 -3
- package/dist/render/backend/webgl2/renderer.js +454 -42
- package/dist/render/backend/webgpu/buffers.d.ts +5 -0
- package/dist/render/backend/webgpu/buffers.js +98 -48
- package/dist/render/backend/webgpu/clothKernels.d.ts +8 -0
- package/dist/render/backend/webgpu/clothKernels.js +76 -0
- package/dist/render/backend/webgpu/clothOps.d.ts +39 -0
- package/dist/render/backend/webgpu/clothOps.js +78 -0
- package/dist/render/backend/webgpu/clothSetLayout.d.ts +25 -0
- package/dist/render/backend/webgpu/clothSetLayout.js +84 -0
- package/dist/render/backend/webgpu/clothSetPack.d.ts +33 -0
- package/dist/render/backend/webgpu/clothSetPack.js +144 -0
- package/dist/render/backend/webgpu/drawCommand.d.ts +2 -0
- package/dist/render/backend/webgpu/drawCommand.js +1 -0
- package/dist/render/backend/webgpu/flatPass.d.ts +1 -1
- package/dist/render/backend/webgpu/flatPass.js +2 -1
- package/dist/render/backend/webgpu/gpuClothSet.d.ts +80 -0
- package/dist/render/backend/webgpu/gpuClothSet.js +462 -0
- package/dist/render/backend/webgpu/latePass.js +1 -0
- package/dist/render/backend/webgpu/motionPass.js +15 -6
- package/dist/render/backend/webgpu/pipelineCache.d.ts +22 -1
- package/dist/render/backend/webgpu/pipelineCache.js +39 -1
- package/dist/render/backend/webgpu/postPass.d.ts +1 -1
- package/dist/render/backend/webgpu/renderer.d.ts +100 -1
- package/dist/render/backend/webgpu/renderer.js +423 -95
- package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.d.ts +9 -2
- package/dist/render/backend/webgpu/shaders/clothSolve.wgsl.js +121 -47
- package/dist/render/backend/webgpu/staticBundles.js +2 -1
- package/dist/render/backend/webgpu/vertexFormats.d.ts +22 -0
- package/dist/render/backend/webgpu/vertexFormats.js +97 -0
- package/dist/render/globalMediumPass.d.ts +2 -0
- package/dist/render/globalMediumPass.js +1 -0
- package/dist/render/indexWidth.d.ts +17 -0
- package/dist/render/indexWidth.js +23 -0
- package/dist/render/instances.d.ts +13 -1
- package/dist/render/instances.js +10 -0
- package/dist/render/lightMatrix.d.ts +11 -0
- package/dist/render/lightMatrix.js +14 -0
- package/dist/render/mesh.d.ts +9 -0
- package/dist/render/mesh.js +38 -14
- package/dist/render/occlusionFade.d.ts +21 -0
- package/dist/render/occlusionFade.js +27 -0
- package/dist/render/renderQuality.d.ts +30 -0
- package/dist/render/renderQuality.js +5 -0
- package/dist/render/rendererHarness.d.ts +7 -0
- package/dist/render/rendererHarness.js +12 -0
- package/dist/render/sceneTarget.d.ts +2 -0
- package/dist/render/sceneTarget.js +1 -1
- package/dist/render/shader.d.ts +15 -0
- package/dist/render/shader.js +41 -0
- package/dist/render/shaders/ambientOcclusion.js +12 -1
- package/dist/render/shaders/flat/directionalShadow.js +84 -10
- package/dist/render/shaders/flat/glassTint.d.ts +1 -1
- package/dist/render/shaders/flat/glassTint.js +3 -0
- package/dist/render/shaders/flat/index.d.ts +15 -0
- package/dist/render/shaders/flat/index.js +24 -4
- package/dist/render/shaders/flat/layered.d.ts +27 -0
- package/dist/render/shaders/flat/layered.js +198 -0
- package/dist/render/shaders/flat/main.d.ts +1 -1
- package/dist/render/shaders/flat/main.js +50 -16
- package/dist/render/shaders/flat/mapReads.d.ts +10 -0
- package/dist/render/shaders/flat/mapReads.js +38 -0
- package/dist/render/shaders/flat/movingSun.d.ts +21 -0
- package/dist/render/shaders/flat/movingSun.js +46 -0
- package/dist/render/shaders/flat/normalMap.d.ts +6 -2
- package/dist/render/shaders/flat/normalMap.js +23 -3
- package/dist/render/shaders/flat/overlay.d.ts +3 -2
- package/dist/render/shaders/flat/overlay.js +41 -19
- package/dist/render/shaders/flat/preamble.js +23 -5
- package/dist/render/shaders/flat/worldUv.d.ts +22 -0
- package/dist/render/shaders/flat/worldUv.js +113 -0
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.d.ts +6 -1
- package/dist/render/shaders/generated/ambientOcclusion.wgsl.js +6 -1
- package/dist/render/shaders/generated/flat.wgsl.d.ts +768 -368
- package/dist/render/shaders/generated/flat.wgsl.js +791 -391
- package/dist/render/shaders/generated/globalMedium.wgsl.d.ts +8 -3
- package/dist/render/shaders/generated/globalMedium.wgsl.js +8 -3
- package/dist/render/shaders/generated/lightVolume.wgsl.d.ts +15 -10
- package/dist/render/shaders/generated/lightVolume.wgsl.js +16 -11
- package/dist/render/shaders/globalMedium.js +9 -1
- package/dist/render/shaders/lightVolume.js +9 -1
- package/dist/render/shaders/tangentFrame.d.ts +1 -1
- package/dist/render/shaders/tangentFrame.js +16 -3
- package/dist/render/skinnedClothRun.d.ts +28 -0
- package/dist/render/skinnedClothRun.js +103 -35
- package/dist/render/surfaceLayers.d.ts +107 -0
- package/dist/render/surfaceLayers.js +82 -0
- package/dist/render/surfaceOverlay.d.ts +16 -3
- package/dist/render/surfaceOverlay.js +11 -6
- package/dist/render/surfaceProjection.d.ts +34 -0
- package/dist/render/surfaceProjection.js +30 -0
- package/dist/render/surfaceTexture.d.ts +39 -0
- package/dist/render/transmission.d.ts +21 -0
- package/dist/render/transmission.js +21 -0
- package/dist/render/vertexPacking.d.ts +48 -0
- package/dist/render/vertexPacking.js +68 -0
- package/dist/ui/splash.d.ts +42 -2
- package/dist/ui/splash.js +78 -13
- package/package.json +6 -6
- package/src/index.ts +6 -2
- package/src/render/ambientOcclusionPass.ts +4 -1
- package/src/render/backend/api.ts +31 -0
- package/src/render/backend/webgl2/renderer.ts +519 -56
- package/src/render/backend/webgpu/buffers.ts +153 -54
- package/src/render/backend/webgpu/clothKernels.ts +86 -0
- package/src/render/backend/webgpu/clothOps.ts +86 -0
- package/src/render/backend/webgpu/clothSetLayout.ts +102 -0
- package/src/render/backend/webgpu/clothSetPack.ts +197 -0
- package/src/render/backend/webgpu/drawCommand.ts +3 -0
- package/src/render/backend/webgpu/flatPass.ts +26 -28
- package/src/render/backend/webgpu/gpuClothSet.ts +564 -0
- package/src/render/backend/webgpu/latePass.ts +1 -0
- package/src/render/backend/webgpu/motionPass.ts +18 -7
- package/src/render/backend/webgpu/pipelineCache.ts +46 -7
- package/src/render/backend/webgpu/renderer.ts +622 -164
- package/src/render/backend/webgpu/shaders/clothSolve.wgsl.ts +121 -47
- package/src/render/backend/webgpu/staticBundles.ts +2 -1
- package/src/render/backend/webgpu/vertexFormats.ts +113 -0
- package/src/render/globalMediumPass.ts +7 -0
- package/src/render/indexWidth.ts +27 -0
- package/src/render/instances.ts +18 -1
- package/src/render/lightMatrix.ts +15 -0
- package/src/render/mesh.ts +66 -14
- package/src/render/occlusionFade.ts +29 -0
- package/src/render/renderQuality.ts +38 -0
- package/src/render/rendererHarness.ts +15 -0
- package/src/render/sceneTarget.ts +3 -0
- package/src/render/shader.ts +59 -0
- package/src/render/shaders/ambientOcclusion.ts +12 -1
- package/src/render/shaders/flat/directionalShadow.ts +84 -10
- package/src/render/shaders/flat/glassTint.ts +7 -1
- package/src/render/shaders/flat/index.ts +39 -4
- package/src/render/shaders/flat/layered.ts +198 -0
- package/src/render/shaders/flat/main.ts +50 -16
- package/src/render/shaders/flat/mapReads.ts +38 -0
- package/src/render/shaders/flat/movingSun.ts +46 -0
- package/src/render/shaders/flat/normalMap.ts +23 -3
- package/src/render/shaders/flat/overlay.ts +41 -19
- package/src/render/shaders/flat/preamble.ts +23 -5
- package/src/render/shaders/flat/worldUv.ts +113 -0
- package/src/render/shaders/generated/ambientOcclusion.wgsl.ts +6 -1
- package/src/render/shaders/generated/flat.wgsl.ts +791 -391
- package/src/render/shaders/generated/globalMedium.wgsl.ts +8 -3
- package/src/render/shaders/generated/lightVolume.wgsl.ts +16 -11
- package/src/render/shaders/globalMedium.ts +9 -1
- package/src/render/shaders/lightVolume.ts +9 -1
- package/src/render/shaders/tangentFrame.ts +16 -3
- package/src/render/skinnedClothRun.ts +138 -38
- package/src/render/surfaceLayers.ts +176 -0
- package/src/render/surfaceOverlay.ts +24 -7
- package/src/render/surfaceProjection.ts +57 -0
- package/src/render/surfaceTexture.ts +39 -0
- package/src/render/transmission.ts +27 -0
- package/src/render/vertexPacking.ts +109 -0
- package/src/ui/splash.ts +83 -14
- package/dist/render/backend/webgpu/gpuSkinnedCloth.d.ts +0 -74
- package/dist/render/backend/webgpu/gpuSkinnedCloth.js +0 -452
- package/src/render/backend/webgpu/gpuSkinnedCloth.ts +0 -502
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Several garments' packs as one set of buffers, so that one dispatch solves a colour of one kind of
|
|
3
|
+
* constraint for every garment at once: `packCloth`'s sections laid end to end, and each kind's
|
|
4
|
+
* records regrouped so a colour of all of them is one range.
|
|
5
|
+
*
|
|
6
|
+
* **Why regrouping by colour keeps each garment's solve.** A batch is a set of constraints that share
|
|
7
|
+
* no movable particle, and two garments share no particle at all, so colour `b` of every garment is
|
|
8
|
+
* still such a set. Each garment's own colours still run in its own order, 0 then 1 then 2, so it is
|
|
9
|
+
* solved exactly as it would be alone: the CPU solver, which steps garments one at a time, is the
|
|
10
|
+
* reference for every one of them.
|
|
11
|
+
*
|
|
12
|
+
* **Every index a record or a static holds is the set's**: a particle is offset by where its garment
|
|
13
|
+
* starts, a joint by where its garment's skin matrices start. A section `packCloth` lays at `s · n`
|
|
14
|
+
* lies at `s · N` here, with a garment's particles at its base inside it, and one more section says
|
|
15
|
+
* which garment each particle is — what a kernel reads its garment's numbers by.
|
|
16
|
+
*
|
|
17
|
+
* **What it gives up**: a colour is dispatched over the most records any garment has in it, so a set
|
|
18
|
+
* of one garment of nine colours and fourteen of three runs nine colours' dispatches for all of them;
|
|
19
|
+
* and a garment joins a set when the set is made, so changing one rebuilds the set.
|
|
20
|
+
*/
|
|
21
|
+
import { CLOTH_STATIC_FLOATS } from './clothSolvePack.ts';
|
|
22
|
+
import type { PackedCloth } from './clothSolvePack.ts';
|
|
23
|
+
|
|
24
|
+
/** Floats of statics a particle in a set: a garment's own, and which garment it is. */
|
|
25
|
+
export const CLOTH_SET_STATIC_FLOATS = CLOTH_STATIC_FLOATS + 1;
|
|
26
|
+
|
|
27
|
+
/** `packCloth`'s sections: where each starts, in particle counts, and its floats a particle. */
|
|
28
|
+
const SECTIONS: readonly (readonly [number, number])[] = [
|
|
29
|
+
[0, 1],
|
|
30
|
+
[1, 1],
|
|
31
|
+
[2, 2],
|
|
32
|
+
[4, 2],
|
|
33
|
+
[6, 1],
|
|
34
|
+
[7, 3],
|
|
35
|
+
[10, 3],
|
|
36
|
+
[13, 16],
|
|
37
|
+
];
|
|
38
|
+
/** Where the influences start, and where the garment's index sits, in particle counts. */
|
|
39
|
+
const INFLUENCES = 13;
|
|
40
|
+
const GARMENT = CLOTH_STATIC_FLOATS;
|
|
41
|
+
|
|
42
|
+
/** Where one garment sits in a set. */
|
|
43
|
+
export interface ClothGarmentRange {
|
|
44
|
+
readonly particleBase: number;
|
|
45
|
+
readonly count: number;
|
|
46
|
+
readonly jointBase: number;
|
|
47
|
+
readonly joints: number;
|
|
48
|
+
readonly colliderBase: number;
|
|
49
|
+
readonly colliders: number;
|
|
50
|
+
/** `packCloth`'s limit flags, the garment's own. */
|
|
51
|
+
readonly limits: number;
|
|
52
|
+
readonly rigged: boolean;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export interface PackedClothSet {
|
|
56
|
+
/** Particles across every garment. */
|
|
57
|
+
readonly count: number;
|
|
58
|
+
readonly statics: Float32Array;
|
|
59
|
+
readonly constraints: Uint32Array;
|
|
60
|
+
readonly distances: number;
|
|
61
|
+
readonly bendings: number;
|
|
62
|
+
readonly tethers: number;
|
|
63
|
+
/** Each kind's colours across the set: colour `b` of every garment is `[b]` up to `[b + 1]`. */
|
|
64
|
+
readonly distanceBatches: Uint32Array;
|
|
65
|
+
readonly bendingBatches: Uint32Array;
|
|
66
|
+
readonly tetherBatches: Uint32Array;
|
|
67
|
+
/** Skin matrices and colliders across every garment. */
|
|
68
|
+
readonly joints: number;
|
|
69
|
+
readonly colliders: number;
|
|
70
|
+
readonly garments: readonly ClothGarmentRange[];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
export function packClothSet(packs: readonly PackedCloth[]): PackedClothSet {
|
|
74
|
+
const garments: ClothGarmentRange[] = [];
|
|
75
|
+
let count = 0;
|
|
76
|
+
let joints = 0;
|
|
77
|
+
let colliders = 0;
|
|
78
|
+
for (const pack of packs) {
|
|
79
|
+
garments.push({
|
|
80
|
+
particleBase: count,
|
|
81
|
+
count: pack.count,
|
|
82
|
+
jointBase: joints,
|
|
83
|
+
joints: pack.joints,
|
|
84
|
+
colliderBase: colliders,
|
|
85
|
+
colliders: pack.colliders,
|
|
86
|
+
limits: pack.limits,
|
|
87
|
+
rigged: pack.rigged,
|
|
88
|
+
});
|
|
89
|
+
count += pack.count;
|
|
90
|
+
joints += pack.joints;
|
|
91
|
+
colliders += pack.colliders;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const statics = new Float32Array(count * CLOTH_SET_STATIC_FLOATS);
|
|
95
|
+
packs.forEach((pack, g) => {
|
|
96
|
+
const { particleBase: base, count: n, jointBase } = garments[g] as ClothGarmentRange;
|
|
97
|
+
for (const [start, stride] of SECTIONS) {
|
|
98
|
+
const from = pack.statics.subarray(start * n, (start + stride) * n);
|
|
99
|
+
statics.set(from, start * count + base * stride);
|
|
100
|
+
}
|
|
101
|
+
/* Each influence's joint, the set's: four joints, four weights, four joints, four weights. */
|
|
102
|
+
for (let i = 0; i < n; i++) {
|
|
103
|
+
const at = INFLUENCES * count + (base + i) * 16;
|
|
104
|
+
for (let k = 0; k < 4; k++) {
|
|
105
|
+
statics[at + k] = (statics[at + k] as number) + jointBase;
|
|
106
|
+
statics[at + 8 + k] = (statics[at + 8 + k] as number) + jointBase;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
statics.fill(g, GARMENT * count + base, GARMENT * count + base + n);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
const distances = sum(packs, (pack) => pack.distances);
|
|
113
|
+
const bendings = sum(packs, (pack) => pack.bendings);
|
|
114
|
+
const tethers = sum(packs, (pack) => pack.tethers);
|
|
115
|
+
const constraints = new Uint32Array(distances * 4 + bendings * 6 + tethers * 3);
|
|
116
|
+
/* Each kind: where its records start, a record's words, how many of them are particles. */
|
|
117
|
+
const distanceBatches = regroup(packs, garments, constraints, 0, 4, 2, 'distanceBatches');
|
|
118
|
+
const bendingStart = distances * 4;
|
|
119
|
+
const bendingBatches = regroup(
|
|
120
|
+
packs,
|
|
121
|
+
garments,
|
|
122
|
+
constraints,
|
|
123
|
+
bendingStart,
|
|
124
|
+
6,
|
|
125
|
+
4,
|
|
126
|
+
'bendingBatches',
|
|
127
|
+
);
|
|
128
|
+
const tetherStart = bendingStart + bendings * 6;
|
|
129
|
+
const tetherBatches = regroup(packs, garments, constraints, tetherStart, 3, 2, 'tetherBatches');
|
|
130
|
+
return {
|
|
131
|
+
count,
|
|
132
|
+
statics,
|
|
133
|
+
constraints,
|
|
134
|
+
distances,
|
|
135
|
+
bendings,
|
|
136
|
+
tethers,
|
|
137
|
+
distanceBatches,
|
|
138
|
+
bendingBatches,
|
|
139
|
+
tetherBatches,
|
|
140
|
+
joints,
|
|
141
|
+
colliders,
|
|
142
|
+
garments,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function sum(packs: readonly PackedCloth[], of: (pack: PackedCloth) => number): number {
|
|
147
|
+
let total = 0;
|
|
148
|
+
for (const pack of packs) total += of(pack);
|
|
149
|
+
return total;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/** Where one kind's records start in a garment's own pack, in words. */
|
|
153
|
+
function kindStart(pack: PackedCloth, kind: BatchKind): number {
|
|
154
|
+
if (kind === 'distanceBatches') return 0;
|
|
155
|
+
if (kind === 'bendingBatches') return pack.distances * 4;
|
|
156
|
+
return pack.distances * 4 + pack.bendings * 6;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
type BatchKind = 'distanceBatches' | 'bendingBatches' | 'tetherBatches';
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* One kind's records, colour by colour and within a colour garment by garment, into `out` from
|
|
163
|
+
* `start`; each record's first `ids` words offset by its garment's first particle. The set's colours.
|
|
164
|
+
*/
|
|
165
|
+
function regroup(
|
|
166
|
+
packs: readonly PackedCloth[],
|
|
167
|
+
garments: readonly ClothGarmentRange[],
|
|
168
|
+
out: Uint32Array,
|
|
169
|
+
start: number,
|
|
170
|
+
words: number,
|
|
171
|
+
ids: number,
|
|
172
|
+
kind: BatchKind,
|
|
173
|
+
): Uint32Array {
|
|
174
|
+
let colours = 0;
|
|
175
|
+
for (const pack of packs) colours = Math.max(colours, pack[kind].length - 1);
|
|
176
|
+
const batches = new Uint32Array(colours + 1);
|
|
177
|
+
let record = 0;
|
|
178
|
+
for (let b = 0; b < colours; b++) {
|
|
179
|
+
packs.forEach((pack, g) => {
|
|
180
|
+
const own = pack[kind];
|
|
181
|
+
if (b + 1 >= own.length) return;
|
|
182
|
+
const base = (garments[g] as ClothGarmentRange).particleBase;
|
|
183
|
+
const from = kindStart(pack, kind);
|
|
184
|
+
for (let r = own[b] as number; r < (own[b + 1] as number); r++) {
|
|
185
|
+
const src = from + r * words;
|
|
186
|
+
const dst = start + record * words;
|
|
187
|
+
for (let w = 0; w < words; w++) {
|
|
188
|
+
const word = pack.constraints[src + w] as number;
|
|
189
|
+
out[dst + w] = w < ids ? word + base : word;
|
|
190
|
+
}
|
|
191
|
+
record++;
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
batches[b + 1] = record;
|
|
195
|
+
}
|
|
196
|
+
return batches;
|
|
197
|
+
}
|
|
@@ -34,6 +34,8 @@ export interface DrawCommand {
|
|
|
34
34
|
readonly vertexBuffers: (GPUBuffer | null)[];
|
|
35
35
|
vertexCount: number;
|
|
36
36
|
indexBuffer: GPUBuffer | null;
|
|
37
|
+
/** How wide an index of `indexBuffer` is: a mesh's own, thirty-two bits for everything else. */
|
|
38
|
+
indexFormat: GPUIndexFormat;
|
|
37
39
|
indexed: boolean;
|
|
38
40
|
count: number;
|
|
39
41
|
instances: number;
|
|
@@ -69,6 +71,7 @@ function emptyCommand(): DrawCommand {
|
|
|
69
71
|
vertexBuffers: new Array<GPUBuffer | null>(VERTEX_BUFFER_SLOTS).fill(null),
|
|
70
72
|
vertexCount: 0,
|
|
71
73
|
indexBuffer: null,
|
|
74
|
+
indexFormat: 'uint32',
|
|
72
75
|
indexed: false,
|
|
73
76
|
count: 0,
|
|
74
77
|
instances: 1,
|
|
@@ -811,34 +811,32 @@ export function flatPipeline(
|
|
|
811
811
|
reflectionSurface = false,
|
|
812
812
|
/** An instanced pipeline that plays a bone animation. The key must carry it: `|anim`. */
|
|
813
813
|
animated = false,
|
|
814
|
-
): GPURenderPipeline {
|
|
815
|
-
|
|
816
|
-
|
|
817
|
-
(
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
),
|
|
841
|
-
true,
|
|
814
|
+
): GPURenderPipeline | null {
|
|
815
|
+
/* None where draws skip a compile and this one has not landed: see `PipelineCache.lit`. */
|
|
816
|
+
return cache.lit(key, () =>
|
|
817
|
+
flatDescriptor(
|
|
818
|
+
cache,
|
|
819
|
+
device,
|
|
820
|
+
layout,
|
|
821
|
+
variant,
|
|
822
|
+
key,
|
|
823
|
+
present,
|
|
824
|
+
translucent,
|
|
825
|
+
skinned,
|
|
826
|
+
morphed,
|
|
827
|
+
depthWrite,
|
|
828
|
+
depthLayer,
|
|
829
|
+
instanced,
|
|
830
|
+
oit,
|
|
831
|
+
doubleSided,
|
|
832
|
+
alphaToCoverage,
|
|
833
|
+
skinEight,
|
|
834
|
+
cloth,
|
|
835
|
+
model,
|
|
836
|
+
skinPass,
|
|
837
|
+
reflectionSurface,
|
|
838
|
+
animated,
|
|
839
|
+
),
|
|
842
840
|
);
|
|
843
841
|
}
|
|
844
842
|
|