Mesh Batch Cache: Optimization, make use of gawain attrib aliases.

This commit is contained in:
Clément Foucault 2017-05-13 22:53:11 +02:00
parent cfbfa94e6b
commit f83a244749
1 changed files with 14 additions and 47 deletions

View File

@ -1932,16 +1932,8 @@ static VertexBuffer *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata
/* initialize vertex format */
unsigned int orco_id = VertexFormat_add_attrib(format, "orco", COMP_F32, 3, KEEP_FLOAT);
unsigned int *uv_id = MEM_mallocN(sizeof(*uv_id) * rdata->uv_len, "UV attrib format");
unsigned int *uv_auto_id = MEM_mallocN(sizeof(*uv_id) * rdata->uv_len, "UV attrib format");
unsigned int *vcol_id = MEM_mallocN(sizeof(*vcol_id) * rdata->vcol_len, "Vcol attrib format");
unsigned int *vcol_auto_id = MEM_mallocN(sizeof(*vcol_id) * rdata->vcol_len, "Vcol attrib format");
unsigned int *tangent_id = MEM_mallocN(sizeof(*tangent_id) * rdata->uv_len, "Tangent attrib format");
/* XXX TODO : We are allocating for the active layers
* but we only need to bind the right layer to the default attrib.
* This is a gawain limitation to solve. */
unsigned int active_uv_id = VertexFormat_add_attrib(format, "u", COMP_F32, 2, KEEP_FLOAT);
unsigned int active_vcol_id = VertexFormat_add_attrib(format, "c", COMP_U8, 3, NORMALIZE_INT_TO_FLOAT);
unsigned int active_tangent_id = VertexFormat_add_attrib(format, "t", COMP_F32, 4, KEEP_FLOAT);
for (int i = 0; i < rdata->uv_len; i++) {
/* UV */
@ -1949,13 +1941,20 @@ static VertexBuffer *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata
uv_id[i] = VertexFormat_add_attrib(format, attrib_name, COMP_F32, 2, KEEP_FLOAT);
/* Auto Name */
/* TODO Remove when when have aliases */
attrib_name = mesh_render_data_uv_auto_layer_uuid_get(rdata, i);
uv_auto_id[i] = VertexFormat_add_attrib(format, attrib_name, COMP_F32, 3, KEEP_FLOAT);
VertexFormat_add_alias(format, attrib_name);
if (i == rdata->uv_active) {
VertexFormat_add_alias(format, "u");
}
/* Tangent */
attrib_name = mesh_render_data_tangent_layer_uuid_get(rdata, i);
tangent_id[i] = VertexFormat_add_attrib(format, attrib_name, COMP_F32, 3, KEEP_FLOAT);
if (i == rdata->uv_active) {
VertexFormat_add_alias(format, "t");
}
}
for (int i = 0; i < rdata->vcol_len; i++) {
@ -1965,7 +1964,11 @@ static VertexBuffer *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata
/* Auto layer */
if (rdata->auto_vcol[i]) {
attrib_name = mesh_render_data_vcol_auto_layer_uuid_get(rdata, i);
vcol_auto_id[i] = VertexFormat_add_attrib(format, attrib_name, COMP_U8, 3, NORMALIZE_INT_TO_FLOAT);
VertexFormat_add_alias(format, attrib_name);
}
if (i == rdata->vcol_active) {
VertexFormat_add_alias(format, "c");
}
}
@ -1992,52 +1995,18 @@ static VertexBuffer *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata
VertexBuffer_set_attrib(vbo, uv_id[j], vidx + 1, tri_uvs[1]);
VertexBuffer_set_attrib(vbo, uv_id[j], vidx + 2, tri_uvs[2]);
/* TODO remove this when aliases will be implemented */
VertexBuffer_set_attrib(vbo, uv_auto_id[j], vidx + 0, tri_uvs[0]);
VertexBuffer_set_attrib(vbo, uv_auto_id[j], vidx + 1, tri_uvs[1]);
VertexBuffer_set_attrib(vbo, uv_auto_id[j], vidx + 2, tri_uvs[2]);
mesh_render_data_looptri_tans_get(rdata, i, j, &tri_tans);
VertexBuffer_set_attrib(vbo, tangent_id[j], vidx + 0, tri_tans[0]);
VertexBuffer_set_attrib(vbo, tangent_id[j], vidx + 1, tri_tans[1]);
VertexBuffer_set_attrib(vbo, tangent_id[j], vidx + 2, tri_tans[2]);
}
/* TODO remove this when aliases will be implemented */
if (rdata->uv_len != 0) {
mesh_render_data_looptri_uvs_get(rdata, i, rdata->uv_active, &tri_uvs);
VertexBuffer_set_attrib(vbo, active_uv_id, vidx + 0, tri_uvs[0]);
VertexBuffer_set_attrib(vbo, active_uv_id, vidx + 1, tri_uvs[1]);
VertexBuffer_set_attrib(vbo, active_uv_id, vidx + 2, tri_uvs[2]);
mesh_render_data_looptri_tans_get(rdata, i, rdata->tangent_active, &tri_tans);
VertexBuffer_set_attrib(vbo, active_tangent_id, vidx + 0, tri_tans[0]);
VertexBuffer_set_attrib(vbo, active_tangent_id, vidx + 1, tri_tans[1]);
VertexBuffer_set_attrib(vbo, active_tangent_id, vidx + 2, tri_tans[2]);
}
/* VCOLs */
for (int j = 0; j < rdata->vcol_len; j++) {
mesh_render_data_looptri_cols_get(rdata, i, j, &tri_cols);
VertexBuffer_set_attrib(vbo, vcol_id[j], vidx + 0, tri_cols[0]);
VertexBuffer_set_attrib(vbo, vcol_id[j], vidx + 1, tri_cols[1]);
VertexBuffer_set_attrib(vbo, vcol_id[j], vidx + 2, tri_cols[2]);
/* Auto layer */
if (rdata->auto_vcol[j]) {
/* TODO remove this when aliases will be implemented */
VertexBuffer_set_attrib(vbo, vcol_auto_id[j], vidx + 0, tri_cols[0]);
VertexBuffer_set_attrib(vbo, vcol_auto_id[j], vidx + 1, tri_cols[1]);
VertexBuffer_set_attrib(vbo, vcol_auto_id[j], vidx + 2, tri_cols[2]);
}
}
/* TODO remove this when aliases will be implemented */
if (rdata->vcol_len != 0) {
mesh_render_data_looptri_cols_get(rdata, i, rdata->vcol_active, &tri_cols);
VertexBuffer_set_attrib(vbo, active_vcol_id, vidx + 0, tri_cols[0]);
VertexBuffer_set_attrib(vbo, active_vcol_id, vidx + 1, tri_cols[1]);
VertexBuffer_set_attrib(vbo, active_vcol_id, vidx + 2, tri_cols[2]);
}
/* ORCO */
@ -2054,9 +2023,7 @@ static VertexBuffer *mesh_batch_cache_get_tri_shading_data(MeshRenderData *rdata
}
MEM_freeN(uv_id);
MEM_freeN(uv_auto_id);
MEM_freeN(vcol_id);
MEM_freeN(vcol_auto_id);
MEM_freeN(tangent_id);
}
return cache->shaded_triangles_data;