Skip to content

Commit ad6ac3e

Browse files
committed
CloudsShadow: fix transition
1 parent cc2a0cb commit ad6ac3e

3 files changed

Lines changed: 90 additions & 65 deletions

File tree

hrt/prefab/rfx/CloudShadow.hx

Lines changed: 25 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -38,33 +38,6 @@ class DirLightWithClouds extends h3d.shader.pbr.Light {
3838
};
3939
}
4040

41-
class DirLightWithCloudsBlend extends DirLightWithClouds {
42-
43-
static var SRC = {
44-
45-
@param var blendFactor : Float;
46-
47-
@param var clouds1 : Sampler2D;
48-
@param var clouds2 : Sampler2D;
49-
50-
@param var distort1 : Sampler2D;
51-
@param var distort2 : Sampler2D;
52-
53-
function fragment() {
54-
pbrLightDirection = lightDir;
55-
pbrLightColor = lightColor;
56-
pbrOcclusionFactor = occlusionFactor;
57-
58-
var pos = transformedPosition.xy * scale;
59-
var uv = pos + time * speed;
60-
if( hasDistort )
61-
uv += mix(distort1.get(uv).r, distort2.get(uv).r, blendFactor) * distortAmount;
62-
var cloudIntensity = mix(clouds1.get(uv).r, clouds2.get(uv).r, blendFactor) * opacity;
63-
pbrLightColor *= 1.0 - cloudIntensity.saturate();
64-
}
65-
};
66-
}
67-
6841
@:access(h3d.scene.pbr.DirLight)
6942
@:access(h3d.scene.Renderer)
7043
class CloudShadow extends RendererFX {
@@ -89,6 +62,18 @@ class CloudShadow extends RendererFX {
8962
updateInstance();
9063
}
9164

65+
override function updateInstance(?propName : String ) {
66+
super.updateInstance(propName);
67+
68+
if( texturePath != null )
69+
dlwc.clouds = Loader.currentInstance.load(texturePath).toTexture().clone();
70+
if( dlwc.clouds != null )
71+
dlwc.clouds.wrap = Repeat;
72+
73+
dlwc.distort = Loader.currentInstance.load(distort.path).toTexture().clone();
74+
if( dlwc.distort != null ) dlwc.distort.wrap = Repeat;
75+
}
76+
9277
override function end(r:h3d.scene.Renderer, step:h3d.impl.RendererFX.Step) {
9378
if( step == Shadows ) {
9479
var ctx = r.ctx;
@@ -116,16 +101,10 @@ class CloudShadow extends RendererFX {
116101
dlwc.scale = 1.0 / scale;
117102
dlwc.opacity = opacity;
118103
dlwc.time = ctx.time;
119-
if( texturePath != null )
120-
dlwc.clouds = Loader.currentInstance.load(texturePath).toTexture();
121-
if( dlwc.clouds != null )
122-
dlwc.clouds.wrap = Repeat;
123104
var dist = distort;
124105
dlwc.hasDistort = dist != null;
125106
if( dist != null && dist.path != null ) {
126107
var angle = dist.angle * Math.PI / 180;
127-
dlwc.distort = Loader.currentInstance.load(dist.path).toTexture();
128-
if( dlwc.distort != null ) dlwc.distort.wrap = Repeat;
129108
dlwc.distortAmount = dist.amount * 0.01;
130109
dlwc.distortSpeed.set(Math.cos(angle) * dist.speed * 0.1, Math.sin(angle) * dist.speed * 0.1);
131110
dlwc.distortScale = dist.scale;
@@ -151,25 +130,7 @@ class CloudShadow extends RendererFX {
151130

152131
var c = new CloudShadow(null, null);
153132

154-
@:privateAccess {
155-
var dlwcBlend = new DirLightWithCloudsBlend();
156-
157-
dlwcBlend.clouds1 = Loader.currentInstance.load(c1.texturePath).toTexture();
158-
dlwcBlend.clouds1.wrap = Repeat;
159-
dlwcBlend.clouds2 = Loader.currentInstance.load(c2.texturePath).toTexture();
160-
dlwcBlend.clouds2.wrap = Repeat;
161-
162-
dlwcBlend.distort1 = Loader.currentInstance.load(c1.distort.path).toTexture();
163-
if( dlwcBlend.distort1 != null ) dlwcBlend.distort1.wrap = Repeat;
164-
dlwcBlend.distort2 = Loader.currentInstance.load(c2.distort.path).toTexture();
165-
if( dlwcBlend.distort2 != null ) dlwcBlend.distort2.wrap = Repeat;
166-
167-
dlwcBlend.hasDistort = dlwcBlend.distort1 != null && dlwcBlend.distort2 != null;
168-
169-
dlwcBlend.blendFactor = 0.;
170-
c.dlwc = dlwcBlend;
171-
}
172-
133+
c.instance = c1.instance;
173134
c.opacity = c1.opacity;
174135
c.scale = c1.scale;
175136
c.speed = c1.speed;
@@ -182,21 +143,32 @@ class CloudShadow extends RendererFX {
182143
angle : c1.distort.angle,
183144
amount : c1.distort.amount
184145
}
146+
c.makeInstance();
147+
if (texturePath != null) {
148+
c.dlwc.clouds?.dispose();
149+
c.dlwc.clouds = new h3d.mat.Texture(c1.dlwc.clouds.width, c1.dlwc.clouds.height, [Target], c1.dlwc.clouds.format);
150+
}
151+
if( c.dlwc.clouds != null )
152+
c.dlwc.clouds.wrap = Repeat;
153+
c.dlwc.distort?.dispose();
154+
c.dlwc.distort = new h3d.mat.Texture(c1.dlwc.distort.width, c1.dlwc.distort.height, [Target], c1.dlwc.distort.format);
155+
if( c.dlwc.distort != null ) c.dlwc.distort.wrap = Repeat;
185156

186157
return { effect : cast c, setFactor : (f : Float) -> {
187158
c.opacity = hxd.Math.lerp(c1.opacity, c2.opacity, f);
188159
c.scale = hxd.Math.lerp(c1.scale, c2.scale, f);
189160
c.speed = hxd.Math.lerp(c1.speed, c2.speed, f);
190161
c.angle = hxd.Math.lerp(c1.angle, c2.angle, f);
191162
c.texturePath = f < 0.5 ? c1.texturePath : c2.texturePath;
163+
h3d.pass.Merge.run(c1.dlwc.clouds, c2.dlwc.clouds, f, c.dlwc.clouds);
164+
h3d.pass.Merge.run(c1.dlwc.distort, c2.dlwc.distort, f, c.dlwc.distort);
192165
c.distort = {
193166
path : f < 0.5 ? c1.distort.path : c2.distort.path,
194167
scale : hxd.Math.lerp(c1.distort.scale, c2.distort.scale, f),
195168
speed : hxd.Math.lerp(c1.distort.speed, c2.distort.speed, f),
196169
angle : hxd.Math.lerp(c1.distort.angle, c2.distort.angle, f),
197170
amount : hxd.Math.lerp(c1.distort.amount, c2.distort.amount, f)
198171
}
199-
@:privateAccess cast (c.dlwc, DirLightWithCloudsBlend).blendFactor = f;
200172
} };
201173
}
202174

@@ -279,5 +251,4 @@ class CloudShadow extends RendererFX {
279251
}
280252

281253
static var _ = Prefab.register("rfx.cloudShadow", CloudShadow);
282-
283254
}

hrt/ui/HuiPrefabEditor.hx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1233,6 +1233,7 @@ class HuiPrefabEditor extends HuiElement {
12331233
scene.disableSceneRender = !visible;
12341234
}
12351235

1236+
12361237
function onSceneEvents(e: hxd.Event) : Void {
12371238
// debugGraph.clear();
12381239
// debugGraph.setColor(0xFF00FF, 1.0);

hrt/ui/HuiToolbar.hx

Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
package hrt.ui;
2+
import h3d.scene.pbr.Renderer;
23

34
#if hui
45
class HuiToolbar extends HuiElement {
@@ -272,39 +273,91 @@ class HuiViewModesWidget extends HuiElement {
272273
btn.onClick = (_) -> {
273274
var renderer = Std.downcast(@:privateAccess s3d.renderer, h3d.scene.pbr.Renderer);
274275
if (renderer != null)
275-
uiBase.addPopup(new hrt.ui.HuiToolbar.HuiViewModesPopup(renderer), { object: Element(this), directionX: StartInside, directionY: EndOutside });
276+
uiBase.addPopup(new hrt.ui.HuiToolbar.HuiViewModesPopup(renderer, s3d), { object: Element(this), directionX: StartInside, directionY: EndOutside });
276277
}
277278
}
278279
}
279280

281+
@:access(h3d.scene.pbr.Renderer)
280282
class HuiViewModesPopup extends HuiPopup {
281283
static var SRC =
282284
<hui-view-modes-popup class="vertical">
283285
<hui-text("View Modes") class="title"/>
284-
for (m in modes) {
285-
<hui-checkbox class="label"/>
286-
<hui-text("LIT") class="label"/>
286+
for (idx => m in modes) {
287+
<hui-element class="horizontal">
288+
<hui-checkbox id="cb[]" onValueChanged={() -> { updateChecked(cb[idx]); m.enable(renderer); }}/>
289+
<hui-text(m.label) class="label"/>
290+
</hui-element>
287291
}
288292
</hui-view-modes-popup>
289293

290-
public static var modes = [1, 2, 3];
294+
var modes : Array<Dynamic> = [];
295+
var s3d : h3d.scene.Scene;
291296
var checked : HuiCheckbox;
292297

293-
public function new(renderer : h3d.scene.pbr.Renderer, ?parent: h2d.Object) {
298+
public function new(renderer : h3d.scene.pbr.Renderer, s3d : h3d.scene.Scene, ?parent: h2d.Object) {
294299
super(parent);
295-
initComponent();
300+
this.s3d = s3d;
301+
modes = [
302+
{ label : "LIT", enable : (renderer : Renderer) -> { renderer.displayMode = Pbr; }},
303+
{ label : "Full", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Full; }},
304+
{ label : "Albedo", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Albedo; }},
305+
{ label : "Normal", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Normal; }},
306+
{ label : "Roughness", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Roughness; }},
307+
{ label : "Metalness", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Metalness; }},
308+
{ label : "Emissive", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Emissive; }},
309+
{ label : "AO", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = AO; }},
310+
{ label : "Shadows", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Shadow; }},
311+
{ label : "Performance", enable : (renderer : Renderer) -> { renderer.displayMode = Performance; }},
312+
{ label : "UV Checker", enable : (renderer : Renderer) -> { renderer.displayMode = Pbr; renderer.slides.shader.mode = Normal; setUVChecker(true); }},
313+
{ label : "Displacement", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Albedo; }},
314+
{ label : "Velocity", enable : (renderer : Renderer) -> { renderer.displayMode = Debug; renderer.slides.shader.mode = Velocity; }}
315+
];
296316

297-
// litCb.value = true;
298-
// checked = litCb;
317+
initComponent();
299318

300-
var shader = @:privateAccess renderer.slides.shader;
319+
checked = cb[0];
320+
cb[0].value = true;
301321
}
302322

303323
function updateChecked(cb : HuiCheckbox) {
304-
checked.value = false;
324+
checked?.value = false;
305325
checked = cb;
306326
checked.value = true;
307327
}
328+
329+
function setUVChecker(enable : Bool) {
330+
function checkUV(obj: h3d.scene.Object) {
331+
var mesh = Std.downcast(obj, h3d.scene.Mesh);
332+
if (mesh != null && mesh.primitive != null && mesh.primitive.buffer != null &&
333+
!mesh.primitive.buffer.isDisposed() &&
334+
mesh.primitive.buffer.format != null &&
335+
mesh.primitive.buffer.format.getInput("uv") != null) {
336+
for (mat in mesh.getMaterials(null, false)) {
337+
if (enable) {
338+
if (mat.mainPass.getShader(h3d.shader.Checker) == null)
339+
mat.mainPass.addShader(new h3d.shader.Checker());
340+
} else {
341+
var s = mat.mainPass.getShader(h3d.shader.Checker);
342+
if (s != null)
343+
mat.mainPass.removeShader(s);
344+
}
345+
}
346+
}
347+
for (idx in 0...obj.numChildren)
348+
checkUV(obj.getChildAt(idx));
349+
}
350+
351+
checkUV(s3d);
352+
}
353+
354+
// function setUVChecker(enable : Bool) {
355+
356+
// }
357+
358+
// function setUVChecker(enable : Bool) {
359+
360+
// }
308361
}
309362

310363
class HuiCameraSettingsPopup extends HuiPopup {

0 commit comments

Comments
 (0)