Fix #36700, z-depth not rendering properly at (n*256)+1 dimensions.
The chunk indices for scheduling chunks based on a given area were calculated incorrectly. This caused chunks at the very border of the render (pixels 256..257) to be omitted, leading to incorrect values in the Z buffer of the test file, which in turn caused wrong normalization range and the resulting almost-white image. Also added a dedicated executePixel function for Z buffer to avoid any interpolation of Z values.
This commit is contained in:
@@ -518,17 +518,15 @@ bool ExecutionGroup::scheduleAreaWhenPossible(ExecutionSystem *graph, rcti *area
|
||||
// find all chunks inside the rect
|
||||
// determine minxchunk, minychunk, maxxchunk, maxychunk where x and y are chunknumbers
|
||||
|
||||
float chunkSizef = this->m_chunkSize;
|
||||
|
||||
int indexx, indexy;
|
||||
int minxchunk = floor((area->xmin - this->m_viewerBorder.xmin) / chunkSizef);
|
||||
int maxxchunk = ceil((area->xmax - 1) / chunkSizef);
|
||||
int minychunk = floor((area->ymin - this->m_viewerBorder.ymin) / chunkSizef);
|
||||
int maxychunk = ceil((area->ymax - 1) / chunkSizef);
|
||||
minxchunk = max(minxchunk, 0);
|
||||
minychunk = max(minychunk, 0);
|
||||
maxxchunk = min(maxxchunk, (int)this->m_numberOfXChunks);
|
||||
maxychunk = min(maxychunk, (int)this->m_numberOfYChunks);
|
||||
int minxchunk = (area->xmin - m_viewerBorder.xmin) / m_chunkSize;
|
||||
int maxxchunk = (area->xmax + m_chunkSize - 1) / m_chunkSize;
|
||||
int minychunk = (area->ymin - m_viewerBorder.ymin) / m_chunkSize;
|
||||
int maxychunk = (area->ymax + m_chunkSize - 1) / m_chunkSize;
|
||||
minxchunk = max_ii(minxchunk, 0);
|
||||
minychunk = max_ii(minychunk, 0);
|
||||
maxxchunk = min_ii(maxxchunk, m_numberOfXChunks);
|
||||
maxychunk = min_ii(maxychunk, m_numberOfYChunks);
|
||||
|
||||
bool result = true;
|
||||
for (indexx = minxchunk; indexx < maxxchunk; indexx++) {
|
||||
|
||||
@@ -234,6 +234,27 @@ RenderLayersDepthProg::RenderLayersDepthProg() : RenderLayersBaseProg(SCE_PASS_Z
|
||||
this->addOutputSocket(COM_DT_VALUE);
|
||||
}
|
||||
|
||||
void RenderLayersDepthProg::executePixel(float output[4], float x, float y, PixelSampler sampler)
|
||||
{
|
||||
int ix = x;
|
||||
int iy = y;
|
||||
float *inputBuffer = this->getInputBuffer();
|
||||
|
||||
if (inputBuffer == NULL || ix < 0 || iy < 0 || ix >= (int)this->getWidth() || iy >= (int)this->getHeight() ) {
|
||||
output[0] = 0.0f;
|
||||
output[1] = 0.0f;
|
||||
output[2] = 0.0f;
|
||||
output[3] = 0.0f;
|
||||
}
|
||||
else {
|
||||
unsigned int offset = (iy * this->getWidth() + ix);
|
||||
output[0] = inputBuffer[offset];
|
||||
output[1] = 0.0f;
|
||||
output[2] = 0.0f;
|
||||
output[3] = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
/* ******** Render Layers Diffuse Operation ******** */
|
||||
|
||||
RenderLayersDiffuseOperation::RenderLayersDiffuseOperation() : RenderLayersBaseProg(SCE_PASS_DIFFUSE, 3)
|
||||
|
||||
@@ -111,7 +111,6 @@ class RenderLayersAlphaProg : public RenderLayersBaseProg {
|
||||
public:
|
||||
RenderLayersAlphaProg();
|
||||
void executePixel(float output[4], float x, float y, PixelSampler sampler);
|
||||
|
||||
};
|
||||
|
||||
class RenderLayersColorOperation : public RenderLayersBaseProg {
|
||||
@@ -127,6 +126,7 @@ public:
|
||||
class RenderLayersDepthProg : public RenderLayersBaseProg {
|
||||
public:
|
||||
RenderLayersDepthProg();
|
||||
void executePixel(float output[4], float x, float y, PixelSampler sampler);
|
||||
};
|
||||
|
||||
class RenderLayersDiffuseOperation : public RenderLayersBaseProg {
|
||||
|
||||
@@ -75,7 +75,6 @@ void WriteBufferOperation::executeRegion(rcti *rect, unsigned int tileNumber)
|
||||
for (x = x1; x < x2; x++) {
|
||||
this->m_input->read(&(buffer[offset4]), x, y, data);
|
||||
offset4 += COM_NUMBER_OF_CHANNELS;
|
||||
|
||||
}
|
||||
if (isBreaked()) {
|
||||
breaked = true;
|
||||
|
||||
Reference in New Issue
Block a user