Merge pull request #47788 from lawnjelly/ewok_dont_multiply_modulate

This commit is contained in:
Rémi Verschelde 2021-04-14 10:25:42 +02:00 committed by GitHub
commit d2936ba54c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 18 additions and 16 deletions

View File

@ -1282,8 +1282,9 @@ PREAMBLE(bool)::_prefill_line(RasterizerCanvas::Item::CommandLine *p_line, FillS
// get the baked line color
Color col = p_line->color;
if (multiply_final_modulate)
if (multiply_final_modulate) {
col *= r_fill_state.final_modulate;
}
BatchColor bcol;
bcol.set(col);
@ -1608,10 +1609,11 @@ bool C_PREAMBLE::_prefill_polygon(RasterizerCanvas::Item::CommandPolygon *p_poly
// the modulate is always baked
Color modulate;
if (!use_large_verts && !use_modulate && multiply_final_modulate)
if (multiply_final_modulate) {
modulate = r_fill_state.final_modulate;
else
} else {
modulate = Color(1, 1, 1, 1);
}
int old_batch_tex_id = r_fill_state.batch_tex_id;
r_fill_state.batch_tex_id = _batch_find_or_create_tex(p_poly->texture, p_poly->normal_map, false, old_batch_tex_id);
@ -1924,10 +1926,11 @@ bool C_PREAMBLE::_prefill_rect(RasterizerCanvas::Item::CommandRect *rect, FillSt
Color col = rect->modulate;
if (!use_large_verts) {
if (multiply_final_modulate) {
col *= r_fill_state.final_modulate;
}
// use_modulate and use_large_verts should have been checked in the calling prefill_item function.
// we don't want to apply the modulate on the CPU if it is stored in the vertex format, it will
// be applied in the shader
if (multiply_final_modulate) {
col *= r_fill_state.final_modulate;
}
// instead of doing all the texture preparation for EVERY rect,
@ -2191,19 +2194,15 @@ PREAMBLE(bool)::prefill_joined_item(FillState &r_fill_state, int &r_command_star
int command_count = p_item->commands.size();
RasterizerCanvas::Item::Command *const *commands = p_item->commands.ptr();
// checking the color for not being white makes it 92/90 times faster in the case where it is white
bool multiply_final_modulate = false;
if (!r_fill_state.is_single_item && (r_fill_state.final_modulate != Color(1, 1, 1, 1))) {
multiply_final_modulate = true;
// whether to multiply final modulate on the CPU, or pass it in the FVF and apply in the shader
bool multiply_final_modulate = true;
if (r_fill_state.is_single_item || bdata.use_modulate || bdata.use_large_verts) {
multiply_final_modulate = false;
}
// start batch is a dummy batch (tex id -1) .. could be made more efficient
if (!r_fill_state.curr_batch) {
// OLD METHOD, but left dangling zero length default batches
// r_fill_state.curr_batch = _batch_request_new();
// r_fill_state.curr_batch->type = RasterizerStorageCommon::BT_DEFAULT;
// r_fill_state.curr_batch->first_command = r_command_start;
// should tex_id be set to -1? check this
// allocate dummy batch on the stack, it should always get replaced
// note that the rest of the structure is uninitialized, this should not matter
@ -2655,6 +2654,9 @@ PREAMBLE(void)::join_sorted_items() {
BItemRef *r = bdata.item_refs.request_with_grow();
r->item = ci;
r->final_modulate = _render_item_state.final_modulate;
// joined item references may introduce new flags
_render_item_state.joined_item->flags |= bdata.joined_item_batch_flags;
}
} // for s through sort items