[Bf-blender-cvs] [ec907807677] blender2.8: Gawain: Add support for rendering using an instance batch (for particles)
Clément Foucault
noreply at git.blender.org
Mon May 29 16:20:40 CEST 2017
Commit: ec90780767721d03322d42f4c5796b7b2d03d8e3
Author: Clément Foucault
Date: Mon May 29 16:28:54 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBec90780767721d03322d42f4c5796b7b2d03d8e3
Gawain: Add support for rendering using an instance batch (for particles)
===================================================================
M intern/gawain/gawain/batch.h
M intern/gawain/src/batch.c
M source/blender/draw/intern/draw_manager.c
M source/blender/draw/modes/object_mode.c
===================================================================
diff --git a/intern/gawain/gawain/batch.h b/intern/gawain/gawain/batch.h
index 9915b0b57f4..33a1c1b653c 100644
--- a/intern/gawain/gawain/batch.h
+++ b/intern/gawain/gawain/batch.h
@@ -73,7 +73,7 @@ void Batch_draw(Batch*);
void Batch_draw_stupid(Batch*);
void Batch_draw_stupid_instanced(Batch*, unsigned int instance_vbo, int instance_count,
int attrib_nbr, int attrib_stride, int attrib_loc[16], int attrib_size[16]);
-
+void Batch_draw_stupid_instanced_with_batch(Batch*, Batch*);
diff --git a/intern/gawain/src/batch.c b/intern/gawain/src/batch.c
index 86dca0a214e..a1e173f6685 100644
--- a/intern/gawain/src/batch.c
+++ b/intern/gawain/src/batch.c
@@ -374,3 +374,69 @@ void Batch_draw_stupid_instanced(Batch* batch, unsigned int instance_vbo, int in
// Batch_done_using_program(batch);
glBindVertexArray(0);
}
+
+void Batch_draw_stupid_instanced_with_batch(Batch* batch_instanced, Batch* batch_instancing)
+ {
+ if (batch_instanced->vao_id)
+ glBindVertexArray(batch_instanced->vao_id);
+ else
+ Batch_prime(batch_instanced);
+
+ if (batch_instanced->program_dirty)
+ Batch_update_program_bindings(batch_instanced);
+
+ VertexBuffer* verts = batch_instancing->verts[0];
+
+ const VertexFormat* format = &verts->format;
+
+ const unsigned attrib_ct = format->attrib_ct;
+ const unsigned stride = format->stride;
+
+ VertexBuffer_use(verts);
+
+ for (unsigned a_idx = 0; a_idx < attrib_ct; ++a_idx)
+ {
+ const Attrib* a = format->attribs + a_idx;
+
+ const GLvoid* pointer = (const GLubyte*)0 + a->offset;
+
+ for (unsigned n_idx = 0; n_idx < a->name_ct; ++n_idx)
+ {
+ const ShaderInput* input = ShaderInterface_attrib(batch_instanced->interface, a->name[n_idx]);
+
+ if (input == NULL) continue;
+
+ glEnableVertexAttribArray(input->location);
+ glVertexAttribDivisor(input->location, 1);
+
+ switch (a->fetch_mode)
+ {
+ case KEEP_FLOAT:
+ case CONVERT_INT_TO_FLOAT:
+ glVertexAttribPointer(input->location, a->comp_ct, a->gl_comp_type, GL_FALSE, stride, pointer);
+ break;
+ case NORMALIZE_INT_TO_FLOAT:
+ glVertexAttribPointer(input->location, a->comp_ct, a->gl_comp_type, GL_TRUE, stride, pointer);
+ break;
+ case KEEP_INT:
+ glVertexAttribIPointer(input->location, a->comp_ct, a->gl_comp_type, stride, pointer);
+ }
+ }
+ }
+
+ // Batch_use_program(batch);
+
+ //gpuBindMatrices(batch->program);
+
+ if (batch_instanced->elem)
+ {
+ const ElementList* el = batch_instanced->elem;
+
+ glDrawElementsInstanced(batch_instanced->gl_prim_type, el->index_ct, GL_UNSIGNED_INT, 0, verts->vertex_ct);
+ }
+ else
+ glDrawArraysInstanced(batch_instanced->gl_prim_type, 0, batch_instanced->verts[0]->vertex_ct, verts->vertex_ct);
+
+ // Batch_done_using_program(batch);
+ glBindVertexArray(0);
+ }
\ No newline at end of file
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index 11c717a5373..cc2ad3e3017 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1133,18 +1133,11 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
DRWInterface *interface = shgroup->interface;
int buffer_size = 0;
- /* XXX All of this is pretty garbage. Better revisit it later. */
if (interface->instance_batch != NULL) {
- VertexBuffer *vert = interface->instance_batch->verts[0];
- /* This is double check but we don't want
- * VertexBuffer_use() to bind the buffer if it exists. */
- if (vert->vbo_id == 0) {
- VertexBuffer_use(vert);
- }
- interface->instance_vbo = vert->vbo_id;
- interface->instance_count = vert->vertex_ct;
+ return;
}
+ /* TODO We still need this because gawain does not support Matrix attribs. */
if (interface->instance_count == 0) {
if (interface->instance_vbo) {
glDeleteBuffers(1, &interface->instance_vbo);
@@ -1163,11 +1156,6 @@ static void shgroup_dynamic_instance(DRWShadingGroup *shgroup)
}
}
- if (interface->instance_batch != NULL) {
- /* Quit just after attribs where specified */
- return;
- }
-
/* Gather Data */
buffer_size = sizeof(float) * interface->attribs_stride * interface->instance_count;
float *data = MEM_mallocN(buffer_size, "Instance VBO data");
@@ -1611,7 +1599,10 @@ static void draw_geometry_execute(DRWShadingGroup *shgroup, Batch *geom)
DRWInterface *interface = shgroup->interface;
/* step 2 : bind vertex array & draw */
Batch_set_program(geom, GPU_shader_get_program(shgroup->shader), GPU_shader_get_interface(shgroup->shader));
- if (interface->instance_vbo) {
+ if (interface->instance_batch) {
+ Batch_draw_stupid_instanced_with_batch(geom, interface->instance_batch);
+ }
+ else if (interface->instance_vbo) {
Batch_draw_stupid_instanced(geom, interface->instance_vbo, interface->instance_count, interface->attribs_count,
interface->attribs_stride, interface->attribs_size, interface->attribs_loc);
}
@@ -1737,7 +1728,9 @@ static void draw_shgroup(DRWShadingGroup *shgroup, DRWState pass_state)
float obmat[4][4];
unit_m4(obmat);
- if (shgroup->type == DRW_SHG_INSTANCE && interface->instance_count > 0) {
+ if (shgroup->type == DRW_SHG_INSTANCE &&
+ (interface->instance_count > 0 || interface->instance_batch != NULL))
+ {
GPU_SELECT_LOAD_IF_PICKSEL_LIST(&shgroup->calls);
draw_geometry(shgroup, shgroup->instance_geom, obmat, NULL);
}
diff --git a/source/blender/draw/modes/object_mode.c b/source/blender/draw/modes/object_mode.c
index f557315305d..026f0c4f275 100644
--- a/source/blender/draw/modes/object_mode.c
+++ b/source/blender/draw/modes/object_mode.c
@@ -1486,9 +1486,6 @@ static void OBJECT_cache_populate_particles(Object *ob,
if (shgrp) {
if (draw_as != PART_DRAW_DOT) {
- DRW_shgroup_attrib_float(shgrp, "pos", 3);
- DRW_shgroup_attrib_float(shgrp, "rot", 4);
- DRW_shgroup_attrib_float(shgrp, "val", 1);
DRW_shgroup_uniform_short_to_int(shgrp, "draw_size", &part->draw_size, 1);
DRW_shgroup_uniform_float(shgrp, "pixel_size", DRW_viewport_pixelsize_get(), 1);
DRW_shgroup_instance_batch(shgrp, geom);
More information about the Bf-blender-cvs
mailing list