Skip to content

Commit dcb2262

Browse files
authored
Merge pull request #2405 from capdevon/capdevon-shadow
Fix NPE on AbstractShadowFilter deserialization
2 parents 3008ac5 + de1289c commit dcb2262

File tree

2 files changed

+83
-16
lines changed

2 files changed

+83
-16
lines changed

jme3-core/src/main/java/com/jme3/shadow/AbstractShadowFilter.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009-2024 jMonkeyEngine
2+
* Copyright (c) 2009-2025 jMonkeyEngine
33
* All rights reserved.
44
*
55
* Redistribution and use in source and binary forms, with or without
@@ -51,7 +51,6 @@
5151
import java.io.IOException;
5252

5353
/**
54-
*
5554
* Generic abstract filter that holds common implementations for the different
5655
* shadow filters
5756
*
@@ -63,9 +62,9 @@ public abstract class AbstractShadowFilter<T extends AbstractShadowRenderer> ext
6362
protected ViewPort viewPort;
6463

6564
/**
66-
* used for serialization
65+
* For serialization only. Do not use.
6766
*/
68-
protected AbstractShadowFilter(){
67+
protected AbstractShadowFilter() {
6968
}
7069

7170
/**
@@ -79,11 +78,8 @@ protected AbstractShadowFilter(){
7978
@SuppressWarnings("all")
8079
protected AbstractShadowFilter(AssetManager manager, int shadowMapSize, T shadowRenderer) {
8180
super("Post Shadow");
82-
material = new Material(manager, "Common/MatDefs/Shadow/PostShadowFilter.j3md");
8381
this.shadowRenderer = shadowRenderer;
84-
this.shadowRenderer.setPostShadowMaterial(material);
85-
86-
//this is legacy setting for shadows with backface shadows
82+
// this is legacy setting for shadows with backface shadows
8783
this.shadowRenderer.setRenderBackFacesShadows(true);
8884
}
8985

@@ -100,6 +96,7 @@ protected boolean isRequiresDepthTexture() {
10096
public Material getShadowMaterial() {
10197
return material;
10298
}
99+
103100
Vector4f tmpv = new Vector4f();
104101

105102
@Override
@@ -113,31 +110,33 @@ protected void preFrame(float tpf) {
113110
@Override
114111
protected void postQueue(RenderQueue queue) {
115112
shadowRenderer.postQueue(queue);
116-
if(shadowRenderer.skipPostPass){
117-
//removing the shadow map so that the post pass is skipped
118-
material.setTexture("ShadowMap0", null);
119-
}
113+
if (shadowRenderer.skipPostPass) {
114+
// removing the shadow map so that the post pass is skipped
115+
material.setTexture("ShadowMap0", null);
116+
}
120117
}
121118

122119
@Override
123120
protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) {
124-
if(!shadowRenderer.skipPostPass){
121+
if (!shadowRenderer.skipPostPass) {
125122
shadowRenderer.setPostShadowParams();
126123
}
127124
}
128125

129126
@Override
130127
protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
131128
shadowRenderer.needsfallBackMaterial = true;
129+
material = new Material(manager, "Common/MatDefs/Shadow/PostShadowFilter.j3md");
130+
shadowRenderer.setPostShadowMaterial(material);
132131
shadowRenderer.initialize(renderManager, vp);
133132
this.viewPort = vp;
134133
}
135-
136-
/**
134+
135+
/**
137136
* How far the shadows are rendered in the view
138137
*
139-
* @see #setShadowZExtend(float zFar)
140138
* @return shadowZExtend
139+
* @see #setShadowZExtend(float zFar)
141140
*/
142141
public float getShadowZExtend() {
143142
return shadowRenderer.getShadowZExtend();
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.jme3.shadow;
2+
3+
import com.jme3.asset.AssetManager;
4+
import com.jme3.asset.DesktopAssetManager;
5+
import com.jme3.export.binary.BinaryExporter;
6+
import com.jme3.light.DirectionalLight;
7+
import com.jme3.light.PointLight;
8+
import com.jme3.light.SpotLight;
9+
import com.jme3.math.ColorRGBA;
10+
import com.jme3.math.Vector3f;
11+
import com.jme3.post.Filter;
12+
import com.jme3.post.FilterPostProcessor;
13+
import org.junit.Assert;
14+
import org.junit.Test;
15+
16+
/**
17+
* Automated tests for the {@code FilterPostProcessing} class.
18+
*
19+
* @author capdevon
20+
*/
21+
public class FilterPostProcessingTest {
22+
23+
/**
24+
* Tests serialization and de-serialization of a {@code FilterPostProcessing}.
25+
*/
26+
@Test
27+
public void testSaveAndLoad() {
28+
AssetManager assetManager = new DesktopAssetManager(true);
29+
30+
FilterPostProcessor fpp = new FilterPostProcessor(assetManager);
31+
fpp.addFilter(createDirectionalLightShadowFilter(assetManager));
32+
fpp.addFilter(createSpotLightShadowFilter(assetManager));
33+
fpp.addFilter(createPointLightShadowFilter(assetManager));
34+
35+
BinaryExporter.saveAndLoad(assetManager, fpp);
36+
}
37+
38+
private DirectionalLightShadowFilter createDirectionalLightShadowFilter(AssetManager assetManager) {
39+
DirectionalLight light = new DirectionalLight();
40+
light.setDirection(new Vector3f(-1, -2, -3).normalizeLocal());
41+
light.setColor(new ColorRGBA(0.8f, 0.8f, 0.8f, 1f));
42+
43+
DirectionalLightShadowFilter dlsf = new DirectionalLightShadowFilter(assetManager, 2048, 1);
44+
dlsf.setLight(light);
45+
46+
return dlsf;
47+
}
48+
49+
private SpotLightShadowFilter createSpotLightShadowFilter(AssetManager assetManager) {
50+
SpotLight light = new SpotLight();
51+
light.setColor(new ColorRGBA(0.8f, 0.8f, 0.8f, 1f));
52+
53+
SpotLightShadowFilter slsf = new SpotLightShadowFilter(assetManager, 2048);
54+
slsf.setLight(light);
55+
56+
return slsf;
57+
}
58+
59+
private PointLightShadowFilter createPointLightShadowFilter(AssetManager assetManager) {
60+
PointLight light = new PointLight();
61+
light.setColor(new ColorRGBA(0.8f, 0.8f, 0.8f, 1f));
62+
63+
PointLightShadowFilter plsf = new PointLightShadowFilter(assetManager, 2048);
64+
plsf.setLight(light);
65+
66+
return plsf;
67+
}
68+
}

0 commit comments

Comments
 (0)