use of net.coderbot.iris.shaderpack.PackRenderTargetDirectives in project Iris by IrisShaders.
the class ClearPassCreator method createClearPasses.
public static ImmutableList<ClearPass> createClearPasses(RenderTargets renderTargets, boolean fullClear, PackRenderTargetDirectives renderTargetDirectives) {
final int maxDrawBuffers = GlStateManager._getInteger(GL21C.GL_MAX_DRAW_BUFFERS);
// Sort buffers by their clear color so we can group up glClear calls.
Map<Vector4f, IntList> clearByColor = new HashMap<>();
renderTargetDirectives.getRenderTargetSettings().forEach((bufferI, settings) -> {
// unboxed
final int buffer = bufferI;
if (fullClear || settings.shouldClear()) {
Vector4f defaultClearColor;
if (buffer == 0) {
// colortex0 is cleared to the fog color (with 1.0 alpha) by default.
defaultClearColor = null;
} else if (buffer == 1) {
// colortex1 is cleared to solid white (with 1.0 alpha) by default.
defaultClearColor = new Vector4f(1.0f, 1.0f, 1.0f, 1.0f);
} else {
// all other buffers are cleared to solid black (with 0.0 alpha) by default.
defaultClearColor = new Vector4f(0.0f, 0.0f, 0.0f, 0.0f);
}
Vector4f clearColor = settings.getClearColor().orElse(defaultClearColor);
clearByColor.computeIfAbsent(clearColor, color -> new IntArrayList()).add(buffer);
}
});
List<ClearPass> clearPasses = new ArrayList<>();
clearByColor.forEach((clearColor, buffers) -> {
int startIndex = 0;
while (startIndex < buffers.size()) {
// clear up to the maximum number of draw buffers per each clear pass.
// This allows us to handle having more than 8 buffers with the same clear color on systems with
// a max draw buffers of 8 (ie, most systems).
int[] clearBuffers = new int[Math.min(buffers.size() - startIndex, maxDrawBuffers)];
for (int i = 0; i < clearBuffers.length; i++) {
clearBuffers[i] = buffers.getInt(startIndex);
startIndex++;
}
// only clear depth if this is the first clear pass
clearPasses.add(new ClearPass(clearColor, renderTargets.createFramebufferWritingToAlt(clearBuffers), clearPasses.isEmpty()));
clearPasses.add(new ClearPass(clearColor, renderTargets.createFramebufferWritingToMain(clearBuffers), false));
}
});
return ImmutableList.copyOf(clearPasses);
}
Aggregations