📄 lightserver.java
字号:
photonThreads[i].join();
} catch (InterruptedException e) {
UI.printError(Module.LIGHT, "Photon thread %d of %d was interrupted", i + 1, photonThreads.length);
return false;
}
}
if (UI.taskCanceled()) {
UI.taskStop(); // shut down task cleanly
return false;
}
photonTimer.end();
UI.taskStop();
UI.printInfo(Module.LIGHT, "Tracing time for %s photons: %s", type, photonTimer.toString());
map.init();
return true;
}
void shadePhoton(ShadingState state, Color power) {
state.getInstance().prepareShadingState(state);
Shader shader = getPhotonShader(state);
// scatter photon
if (shader != null)
shader.scatterPhoton(state, power);
}
void traceDiffusePhoton(ShadingState previous, Ray r, Color power) {
if (previous.getDiffuseDepth() >= maxDiffuseDepth)
return;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
if (previous.getIntersectionState().hit()) {
// create a new shading context
ShadingState state = ShadingState.createDiffuseBounceState(previous, r, 0);
shadePhoton(state, power);
}
}
void traceReflectionPhoton(ShadingState previous, Ray r, Color power) {
if (previous.getReflectionDepth() >= maxReflectionDepth)
return;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
if (previous.getIntersectionState().hit()) {
// create a new shading context
ShadingState state = ShadingState.createReflectionBounceState(previous, r, 0);
shadePhoton(state, power);
}
}
void traceRefractionPhoton(ShadingState previous, Ray r, Color power) {
if (previous.getRefractionDepth() >= maxRefractionDepth)
return;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
if (previous.getIntersectionState().hit()) {
// create a new shading context
ShadingState state = ShadingState.createRefractionBounceState(previous, r, 0);
shadePhoton(state, power);
}
}
private Shader getShader(ShadingState state) {
return shaderOverride != null ? shaderOverride : state.getShader();
}
private Shader getPhotonShader(ShadingState state) {
return (shaderOverride != null && shaderOverridePhotons) ? shaderOverride : state.getShader();
}
ShadingState getRadiance(float rx, float ry, int i, Ray r, IntersectionState istate) {
scene.trace(r, istate);
if (istate.hit()) {
ShadingState state = ShadingState.createState(istate, rx, ry, r, i, this);
state.getInstance().prepareShadingState(state);
Shader shader = getShader(state);
if (shader == null) {
state.setResult(Color.BLACK);
return state;
}
if (shadingCache != null) {
Color c = lookupShadingCache(state, shader);
if (c != null) {
state.setResult(c);
return state;
}
}
state.setResult(shader.getRadiance(state));
if (shadingCache != null)
addShadingCache(state, shader, state.getResult());
return state;
} else
return null;
}
void shadeBakeResult(ShadingState state) {
Shader shader = getShader(state);
if (shader != null)
state.setResult(shader.getRadiance(state));
else
state.setResult(Color.BLACK);
}
Color shadeHit(ShadingState state) {
state.getInstance().prepareShadingState(state);
Shader shader = getShader(state);
return (shader != null) ? shader.getRadiance(state) : Color.BLACK;
}
private static final int hash(int x, int y) {
// long bits = java.lang.Double.doubleToLongBits(x);
// bits ^= java.lang.Double.doubleToLongBits(y) * 31;
// return (((int) bits) ^ ((int) (bits >> 32)));
return x ^ y;
}
private synchronized Color lookupShadingCache(ShadingState state, Shader shader) {
if (state.getNormal() == null)
return null;
cacheLookups++;
int cx = (int) (state.getRasterX() * shadingCacheResolution);
int cy = (int) (state.getRasterY() * shadingCacheResolution);
int hash = hash(cx, cy);
CacheEntry e = shadingCache[hash & (shadingCache.length - 1)];
if (e == null) {
cacheEmptyEntryMisses++;
return null;
}
// entry maps to correct pixel
if (e.cx == cx && e.cy == cy) {
// search further
for (Sample s = e.first; s != null; s = s.next) {
if (s.i != state.getInstance())
continue;
// if (s.prim != state.getPrimitiveID())
// continue;
if (s.s != shader)
continue;
if (state.getNormal().dot(s.nx, s.ny, s.nz) < 0.95f)
continue;
// we have a match
cacheHits++;
return s.c;
}
} else
cacheWrongEntryMisses++;
return null;
}
private synchronized void addShadingCache(ShadingState state, Shader shader, Color c) {
// don't cache samples with null normals
if (state.getNormal() == null)
return;
cacheEntryAdditions++;
int cx = (int) (state.getRasterX() * shadingCacheResolution);
int cy = (int) (state.getRasterY() * shadingCacheResolution);
int h = hash(cx, cy) & (shadingCache.length - 1);
CacheEntry e = shadingCache[h];
// new entry ?
if (e == null)
e = shadingCache[h] = new CacheEntry();
Sample s = new Sample();
s.i = state.getInstance();
// s.prim = state.getPrimitiveID();
s.s = shader;
s.c = c;
s.nx = state.getNormal().x;
s.ny = state.getNormal().y;
s.nz = state.getNormal().z;
if (e.cx == cx && e.cy == cy) {
// same pixel - just add to the front of the list
s.next = e.first;
e.first = s;
} else {
// different pixel - new list
e.cx = cx;
e.cy = cy;
s.next = null;
e.first = s;
}
}
Color traceGlossy(ShadingState previous, Ray r, int i) {
// limit path depth and disable caustic paths
if (previous.getReflectionDepth() >= maxReflectionDepth || previous.getDiffuseDepth() > 0)
return Color.BLACK;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
return istate.hit() ? shadeHit(ShadingState.createGlossyBounceState(previous, r, i)) : Color.BLACK;
}
Color traceReflection(ShadingState previous, Ray r, int i) {
// limit path depth and disable caustic paths
if (previous.getReflectionDepth() >= maxReflectionDepth || previous.getDiffuseDepth() > 0)
return Color.BLACK;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
return istate.hit() ? shadeHit(ShadingState.createReflectionBounceState(previous, r, i)) : Color.BLACK;
}
Color traceRefraction(ShadingState previous, Ray r, int i) {
// limit path depth and disable caustic paths
if (previous.getRefractionDepth() >= maxRefractionDepth || previous.getDiffuseDepth() > 0)
return Color.BLACK;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
return istate.hit() ? shadeHit(ShadingState.createRefractionBounceState(previous, r, i)) : Color.BLACK;
}
ShadingState traceFinalGather(ShadingState previous, Ray r, int i) {
if (previous.getDiffuseDepth() >= maxDiffuseDepth)
return null;
IntersectionState istate = previous.getIntersectionState();
scene.trace(r, istate);
return istate.hit() ? ShadingState.createFinalGatherState(previous, r, i) : null;
}
Color getGlobalRadiance(ShadingState state) {
if (giEngine == null)
return Color.BLACK;
return giEngine.getGlobalRadiance(state);
}
Color getIrradiance(ShadingState state, Color diffuseReflectance) {
// no gi engine, or we have already exceeded number of available bounces
if (giEngine == null || state.getDiffuseDepth() >= maxDiffuseDepth)
return Color.BLACK;
return giEngine.getIrradiance(state, diffuseReflectance);
}
void initLightSamples(ShadingState state) {
for (LightSource l : lights)
l.getSamples(state);
}
void initCausticSamples(ShadingState state) {
if (causticPhotonMap != null)
causticPhotonMap.getSamples(state);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -