@@ -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 )
7043class 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}
0 commit comments