Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9db96a6

Browse files
committed
Create GBuffer struct based on gBuffer components
1 parent137f148 commit9db96a6

File tree

2 files changed

+75
-37
lines changed

2 files changed

+75
-37
lines changed

‎src/utils/EffectMaterialManager.ts‎

Lines changed: 67 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { GBufferConfig } from "./GBufferConfig.js";
66
import{EffectShaderData}from"./EffectShaderData.js";
77
import{EffectMaterial}from"../materials/EffectMaterial.js";
88
import{ShaderData}from"../core/ShaderData.js";
9+
import{GBuffer}from"../enums/GBuffer.js";
910

1011
/**
1112
* An effect material manager that creates, updates and caches effect shader combinations.
@@ -70,6 +71,12 @@ export class EffectMaterialManager implements Disposable {
7071

7172
private_gBufferConfig:GBufferConfig|null;
7273

74+
/**
75+
*@see {@link gBufferConfig}
76+
*/
77+
78+
private_gBuffer:Set<GBuffer|string>|null;
79+
7380
/**
7481
*@see {@link dithering}
7582
*/
@@ -93,6 +100,7 @@ export class EffectMaterialManager implements Disposable {
93100
this.activeMaterial=null;
94101

95102
this._gBufferConfig=null;
103+
this._gBuffer=null;
96104
this._dithering=false;
97105

98106
}
@@ -130,6 +138,29 @@ export class EffectMaterialManager implements Disposable {
130138

131139
}
132140

141+
/**
142+
* The current input G-Buffer components.
143+
*
144+
* Assigning a new G-Buffer will invalidate the material cache.
145+
*/
146+
147+
getgBuffer():Set<GBuffer|string>|null{
148+
149+
returnthis._gBuffer;
150+
151+
}
152+
153+
setgBuffer(value:Set<GBuffer|string>|null){
154+
155+
if(this._gBuffer!==value){
156+
157+
this.invalidateMaterialCache();
158+
this._gBuffer=value;
159+
160+
}
161+
162+
}
163+
133164
/**
134165
* Indicates whether dithering is enabled.
135166
*/
@@ -178,14 +209,14 @@ export class EffectMaterialManager implements Disposable {
178209

179210
privategetEffectShaderData(effects:Effect[]):EffectShaderData{
180211

181-
constresult=newEffectShaderData(this.gBufferConfig);
212+
constresult=newEffectShaderData();
182213
consteffectShaderDataCache=this.effectShaderDataCache;
183214

184215
for(consteffectofeffects){
185216

186217
if(!effectShaderDataCache.has(effect)){
187218

188-
constdata=newEffectShaderData(this.gBufferConfig);
219+
constdata=newEffectShaderData();
189220
data.integrateEffect(`e${effect.id}`,effect);
190221
effectShaderDataCache.set(effect,data);
191222

@@ -203,6 +234,31 @@ export class EffectMaterialManager implements Disposable {
203234

204235
}
205236

237+
/**
238+
* Creates shader code for a `GBuffer` struct declaration.
239+
*
240+
*@param gBufferConfig - A G-Buffer config.
241+
*@return The shader code.
242+
*/
243+
244+
privatecreateGBufferStructDeclaration(gBufferConfig:GBufferConfig):string{
245+
246+
if(this.gBuffer===null){
247+
248+
thrownewError("Missing G-Buffer information");
249+
250+
}
251+
252+
return[
253+
"struct GBuffer {",
254+
...Array.from(gBufferConfig.gBufferStructDeclaration)
255+
.filter(x=>this.gBuffer!.has(x[0]))
256+
.map(x=>`\t${x[1]}`),
257+
"};\n"
258+
].join("\n");
259+
260+
}
261+
206262
/**
207263
* Creates a material based on the given effects.
208264
*
@@ -217,9 +273,15 @@ export class EffectMaterialManager implements Disposable {
217273
constresult=(id===EffectMaterialManager.DEFAULT_MATERIAL_ID) ?this.defaultMaterial :newEffectMaterial();
218274
constdata=this.getEffectShaderData(effects);
219275

220-
data.shaderParts.set(Section.FRAGMENT_HEAD_GBUFFER,data.createGBufferStruct());
221-
data.shaderParts.set(Section.FRAGMENT_HEAD_GDATA,data.createGDataStructDeclaration());
222-
data.shaderParts.set(Section.FRAGMENT_MAIN_GDATA,data.createGDataStructInitialization());
276+
constgBufferConfig=this.gBufferConfig;
277+
278+
if(gBufferConfig!==null){
279+
280+
data.shaderParts.set(Section.FRAGMENT_HEAD_GBUFFER,this.createGBufferStructDeclaration(gBufferConfig));
281+
data.shaderParts.set(Section.FRAGMENT_HEAD_GDATA,data.createGDataStructDeclaration(gBufferConfig));
282+
data.shaderParts.set(Section.FRAGMENT_MAIN_GDATA,data.createGDataStructInitialization(gBufferConfig));
283+
284+
}
223285

224286
constfragmentHead=data.shaderParts.get(Section.FRAGMENT_HEAD_EFFECTS)!;
225287
data.shaderParts.set(Section.FRAGMENT_HEAD_EFFECTS,fragmentHead+data.createBlendFunctions());

‎src/utils/EffectShaderData.ts‎

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,11 @@ export class EffectShaderData implements ShaderData {
6060

6161
private_colorSpace:ColorSpace;
6262

63-
/**
64-
* A G-Buffer configuration.
65-
*/
66-
67-
privatereadonlygBufferConfig:GBufferConfig;
68-
6963
/**
7064
* Constructs new shader data.
7165
*/
7266

73-
constructor(gBufferConfig:GBufferConfig|null=null){
74-
75-
this.gBufferConfig=gBufferConfig??newGBufferConfig();
67+
constructor(){
7668

7769
this.shaderParts=newMap<EffectShaderSection,string>([
7870
[EffectShaderSection.FRAGMENT_HEAD_EFFECTS,""],
@@ -418,35 +410,18 @@ export class EffectShaderData implements ShaderData {
418410

419411
}
420412

421-
/**
422-
* Creates a `GBuffer` struct declaration shader code.
423-
*
424-
*@return The shader code.
425-
*/
426-
427-
createGBufferStruct():string{
428-
429-
return[
430-
"struct GBuffer {",
431-
...Array.from(this.gBufferConfig.gBufferStructDeclaration)
432-
.filter(x=>this.gData.has(x[0]))
433-
.map(x=>`\t${x[1]}`),
434-
"};\n"
435-
].join("\n");
436-
437-
}
438-
439413
/**
440414
* Creates shader code for a `GData` struct declaration.
441415
*
416+
*@param gBufferConfig - A G-Buffer config.
442417
*@return The shader code.
443418
*/
444419

445-
createGDataStructDeclaration():string{
420+
createGDataStructDeclaration(gBufferConfig:GBufferConfig):string{
446421

447422
return[
448423
"struct GData {",
449-
...Array.from(this.gBufferConfig.gDataStructDeclaration)
424+
...Array.from(gBufferConfig.gDataStructDeclaration)
450425
.filter(x=>this.gData.has(x[0]))
451426
.map(x=>`\t${x[1]}`),
452427
"};\n"
@@ -457,13 +432,14 @@ export class EffectShaderData implements ShaderData {
457432
/**
458433
* Creates shader code for the `GData` struct initialization.
459434
*
435+
*@param gBufferConfig - A G-Buffer config.
460436
*@return The shader code.
461437
*/
462438

463-
createGDataStructInitialization():string{
439+
createGDataStructInitialization(gBufferConfig:GBufferConfig):string{
464440

465-
constgDataDependencies=this.gBufferConfig.gDataDependencies;
466-
constgDataStructInitialization=this.gBufferConfig.gDataStructInitialization;
441+
constgDataDependencies=gBufferConfig.gDataDependencies;
442+
constgDataStructInitialization=gBufferConfig.gDataStructInitialization;
467443

468444
constdependencyGraph=newMap<string,Iterable<string>>(
469445
Array.from(this.gData)

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp