[Bf-blender-cvs] [5ad6ab9] strand_gpu: Merge branch 'strand_editmode' into strand_gpu_editmode

Lukas Tönne noreply at git.blender.org
Wed Jul 6 12:13:17 CEST 2016


Commit: 5ad6ab98cd369036e5469995c44825c182c59684
Author: Lukas Tönne
Date:   Tue Jul 5 10:47:24 2016 +0200
Branches: strand_gpu
https://developer.blender.org/rB5ad6ab98cd369036e5469995c44825c182c59684

Merge branch 'strand_editmode' into strand_gpu_editmode

===================================================================



===================================================================

diff --cc source/blender/blenkernel/intern/mesh_sample.c
index 07ddc42,afc4959..5842a39
--- a/source/blender/blenkernel/intern/mesh_sample.c
+++ b/source/blender/blenkernel/intern/mesh_sample.c
@@@ -682,3 -687,92 +687,93 @@@ bool BKE_mesh_sample_generate(MeshSampl
  {
  	return gen->make_sample(gen, sample);
  }
++
+ /* ==== Utilities ==== */
+ 
+ #include "DNA_particle_types.h"
+ 
+ #include "BKE_bvhutils.h"
+ #include "BKE_particle.h"
+ 
+ bool BKE_mesh_sample_from_particle(MeshSample *sample, ParticleSystem *psys, DerivedMesh *dm, ParticleData *pa)
+ {
+ 	MVert *mverts;
+ 	MFace *mface;
+ 	float mapfw[4];
+ 	int mapindex;
+ 	float *co1 = NULL, *co2 = NULL, *co3 = NULL, *co4 = NULL;
+ 	float vec[3];
+ 	float w[4];
+ 	
+ 	if (!psys_get_index_on_dm(psys, dm, pa, &mapindex, mapfw))
+ 		return false;
+ 	
+ 	mface = dm->getTessFaceData(dm, mapindex, CD_MFACE);
+ 	mverts = dm->getVertDataArray(dm, CD_MVERT);
+ 	
+ 	co1 = mverts[mface->v1].co;
+ 	co2 = mverts[mface->v2].co;
+ 	co3 = mverts[mface->v3].co;
+ 	
+ 	if (mface->v4) {
+ 		co4 = mverts[mface->v4].co;
+ 		
+ 		interp_v3_v3v3v3v3(vec, co1, co2, co3, co4, mapfw);
+ 	}
+ 	else {
+ 		interp_v3_v3v3v3(vec, co1, co2, co3, mapfw);
+ 	}
+ 	
+ 	/* test both triangles of the face */
+ 	interp_weights_face_v3(w, co1, co2, co3, NULL, vec);
+ 	if (w[0] <= 1.0f && w[1] <= 1.0f && w[2] <= 1.0f) {
+ 		sample->orig_verts[0] = mface->v1;
+ 		sample->orig_verts[1] = mface->v2;
+ 		sample->orig_verts[2] = mface->v3;
+ 	
+ 		copy_v3_v3(sample->orig_weights, w);
+ 		return true;
+ 	}
+ 	else if (mface->v4) {
+ 		interp_weights_face_v3(w, co3, co4, co1, NULL, vec);
+ 		sample->orig_verts[0] = mface->v3;
+ 		sample->orig_verts[1] = mface->v4;
+ 		sample->orig_verts[2] = mface->v1;
+ 	
+ 		copy_v3_v3(sample->orig_weights, w);
+ 		return true;
+ 	}
+ 	else
+ 		return false;
+ }
+ 
+ bool BKE_mesh_sample_to_particle(MeshSample *sample, ParticleSystem *UNUSED(psys), DerivedMesh *dm, BVHTreeFromMesh *bvhtree, ParticleData *pa)
+ {
+ 	BVHTreeNearest nearest;
+ 	float vec[3], nor[3], tang[3];
+ 	
+ 	BKE_mesh_sample_eval(dm, sample, vec, nor, tang);
+ 	
+ 	nearest.index = -1;
+ 	nearest.dist_sq = FLT_MAX;
+ 	BLI_bvhtree_find_nearest(bvhtree->tree, vec, &nearest, bvhtree->nearest_callback, bvhtree);
+ 	if (nearest.index >= 0) {
+ 		MFace *mface = dm->getTessFaceData(dm, nearest.index, CD_MFACE);
+ 		MVert *mverts = dm->getVertDataArray(dm, CD_MVERT);
+ 		
+ 		float *co1 = mverts[mface->v1].co;
+ 		float *co2 = mverts[mface->v2].co;
+ 		float *co3 = mverts[mface->v3].co;
+ 		float *co4 = mface->v4 ? mverts[mface->v4].co : NULL;
+ 		
+ 		pa->num = nearest.index;
+ 		pa->num_dmcache = DMCACHE_NOTFOUND;
+ 		
+ 		interp_weights_face_v3(pa->fuv, co1, co2, co3, co4, vec);
+ 		pa->foffset = 0.0f; /* XXX any sensible way to reconstruct this? */
+ 		
+ 		return true;
+ 	}
+ 	else
+ 		return false;
+ }
diff --cc source/blender/editors/space_view3d/drawstrands.c
index f03ccae,dd37e41..7161de7
--- a/source/blender/editors/space_view3d/drawstrands.c
+++ b/source/blender/editors/space_view3d/drawstrands.c
@@@ -33,60 -29,354 +33,407 @@@
  
  #include "DNA_object_types.h"
  #include "DNA_scene_types.h"
 +#include "DNA_screen_types.h"
 +#include "DNA_strand_types.h"
  #include "DNA_view3d_types.h"
  
 +#include "BLI_utildefines.h"
 +#include "BLI_math.h"
 +
+ #include "BKE_editstrands.h"
 +#include "BKE_DerivedMesh.h"
+ #include "BKE_main.h"
 +#include "BKE_strands.h"
  
+ #include "bmesh.h"
+ 
 +#include "BIF_gl.h"
++#include "BIF_glutil.h"
 +
 +#include "GPU_buffers.h"
 +#include "GPU_debug.h"
++#include "GPU_draw.h"
++#include "GPU_extensions.h"
++#include "GPU_select.h"
 +#include "GPU_shader.h"
 +#include "GPU_strands.h"
 +
+ #include "ED_screen.h"
+ #include "ED_types.h"
+ 
+ #include "UI_resources.h"
+ #include "UI_interface_icons.h"
+ 
 -#include "BIF_gl.h"
 -#include "BIF_glutil.h"
 +#include "view3d_intern.h"  // own include
  
 -#include "GPU_draw.h"
 -#include "GPU_extensions.h"
 -#include "GPU_select.h"
 +void draw_strands(Strands *strands, StrandData *data, Object *ob, RegionView3D *rv3d,
 +                  bool show_controls, bool show_strands)
 +{
 +	GPUStrandsShader *gpu_shader = GPU_strand_shader_get(strands);
 +	
 +	if (show_controls) {
 +		GPU_strands_setup_edges(data);
 +		GPUDrawStrands *gds = data->gpu_buffer;
 +		if (gds->control_points && gds->control_edges) {
 +			GPU_buffer_draw_elements(gds->control_edges, GL_LINES, 0,
 +			                         (gds->totverts - gds->totcurves) * 2);
 +		}
 +		GPU_buffers_unbind();
 +	}
 +	
 +	if (show_strands) {
 +		GPU_strand_shader_bind_uniforms(gpu_shader, ob->obmat, rv3d->viewmat);
 +		GPU_strand_shader_bind(gpu_shader, rv3d->viewmat, rv3d->viewinv);
 +		
 +		GPU_strands_setup_roots(data);
 +		GPUDrawStrands *gds = data->gpu_buffer;
 +		if (gds->root_points) {
 +			struct GPUAttrib *attrib;
 +			int num_attrib;
 +			GPU_strand_shader_get_attributes(strands->gpu_shader, &attrib, &num_attrib);
 +			
 +			int elemsize = GPU_attrib_element_size(attrib, num_attrib);
 +			GPU_interleaved_attrib_setup(gds->root_points, attrib, num_attrib, elemsize, false);
 +			
 +			glDrawArrays(GL_POINTS, 0, gds->totroots * elemsize);
 +			
 +			GPU_interleaved_attrib_unbind();
 +		}
 +		GPU_strands_buffer_unbind();
 +		
 +		GPU_strand_shader_unbind(gpu_shader);
 +	}
 +}
+ 
 -#include "view3d_intern.h"
++/*************************/
++/*** Edit Mode Drawing ***/
+ 
+ typedef enum StrandsShadeMode {
+ 	STRANDS_SHADE_FLAT,
+ 	STRANDS_SHADE_HAIR,
+ } StrandsShadeMode;
+ 
+ typedef struct StrandsDrawInfo {
+ 	bool has_zbuf;
+ 	bool use_zbuf_select;
+ 	
+ 	StrandsShadeMode shade_mode;
+ 	int select_mode;
+ 	
+ 	float col_base[4];
+ 	float col_select[4];
+ } StrandsDrawInfo;
+ 
+ BLI_INLINE bool strands_use_normals(const StrandsDrawInfo *info)
+ {
+ 	return ELEM(info->shade_mode, STRANDS_SHADE_HAIR);
+ }
+ 
+ static void init_draw_info(StrandsDrawInfo *info, View3D *v3d,
+                            StrandsShadeMode shade_mode, int select_mode)
+ {
+ 	info->has_zbuf = v3d->zbuf;
+ 	info->use_zbuf_select = (v3d->flag & V3D_ZBUF_SELECT);
+ 	
+ 	info->shade_mode = shade_mode;
+ 	info->select_mode = select_mode;
+ 	
+ 	/* get selection theme colors */
+ 	UI_GetThemeColor4fv(TH_VERTEX, info->col_base);
+ 	UI_GetThemeColor4fv(TH_VERTEX_SELECT, info->col_select);
+ }
+ 
+ static void set_opengl_state_strands(const StrandsDrawInfo *info)
+ {
+ 	if (!info->use_zbuf_select)
+ 		glDisable(GL_DEPTH_TEST);
+ 	glEnable(GL_BLEND);
+ 	
+ 	if (ELEM(info->shade_mode, STRANDS_SHADE_HAIR)) {
+ 		glEnable(GL_LIGHTING);
+ 		glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE);
+ 		glEnable(GL_COLOR_MATERIAL);
+ 		glShadeModel(GL_SMOOTH);
+ 	}
+ 	else {
+ 		glDisable(GL_LIGHTING);
+ 	}
+ 	
+ 	glEnableClientState(GL_VERTEX_ARRAY);
+ 	if (strands_use_normals(info))
+ 		glEnableClientState(GL_NORMAL_ARRAY);
+ }
+ 
+ static void set_opengl_state_dots(const StrandsDrawInfo *info)
+ {
+ 	if (!info->use_zbuf_select)
+ 		glDisable(GL_DEPTH_TEST);
+ 	glEnable(GL_BLEND);
+ 	
+ 	glDisable(GL_LIGHTING);
+ 	
+ 	glEnableClientState(GL_VERTEX_ARRAY);
+ 	glPointSize(3.0);
+ }
+ 
+ static void restore_opengl_state(const StrandsDrawInfo *info)
+ {
+ 	glDisableClientState(GL_NORMAL_ARRAY);
+ 	glDisableClientState(GL_VERTEX_ARRAY);
+ 	
+ 	glDisable(GL_BLEND);
+ 	glDisable(GL_LIGHTING);
+ 	glDisable(GL_COLOR_MATERIAL);
+ 	glShadeModel(GL_FLAT);
+ 	if (info->has_zbuf)
+ 		glEnable(GL_DEPTH_TEST);
+ 	glLineWidth(1.0f);
+ 	glPointSize(1.0);
+ }
+ 
+ /* ------------------------------------------------------------------------- */
+ /* strands */
+ 
+ static void setup_gpu_buffers_strands(BMEditStrands *edit, const StrandsDrawInfo *info)
+ {
+ 	const size_t size_v3 = sizeof(float) * 3;
+ 	const size_t size_vertex = (strands_use_normals(info) ? 2*size_v3 : size_v3);
+ 	BMesh *bm = edit->base.bm;
+ 	
+ //	int totstrands = BM_strands_count(edit->bm);
+ 	int totvert = bm->totvert;
+ 	int totedge = bm->totedge;
+ 	
+ 	if (!edit->vertex_glbuf)
+ 		glGenBuffers(1, &edit->vertex_glbuf);
+ 	if (!edit->elem_glbuf)
+ 		glGenBuffers(1, &edit->elem_glbuf);
+ 	
+ 	glBindBuffer(GL_ARRAY_BUFFER, edit->vertex_glbuf);
+ 	glBufferData(GL_ARRAY_BUFFER, size_vertex * totvert, NULL, GL_DYNAMIC_DRAW);
+ 	
+ 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, edit->elem_glbuf);
+ 	glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(unsigned int) * totedge * 2, NULL, GL_DYNAMIC_DRAW);
+ 	
+ 	glVertexPointer(3, GL_FLOAT, size_vertex, NULL);
+ 	if (strands_use_normals(info))
+ 		glNormalPointer(GL_FLOAT, size_vertex, (GLubyte *)NULL + size_v3);
+ }
+ 
+ static void unbind_gpu_buffers_strands(void)
+ {
+ 	glBindBuffer(GL_ARRAY_BUFFER, 0);
+ 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+ 
+ static int write_gpu_buffers_strands(BMEditStrands *edit, const StrandsDrawInfo *info)
+ {
+ 	const size_t size_v3 = sizeof(float) * 3;
+ 	const size_t size_vertex = (strands_use_normals(info) ? 2*size_v3 : size_v3);
+ 	BMesh *bm = edit->base.bm;
+ 	
+ 	GLubyte *vertex_data;
+ 	unsigned int *elem_data;
+ 	BMVert *root, *v, *vprev;
+ 	BMIter iter, iter_strand;
+ 	int index, indexprev, index_edge;
+ 	int k;
+ 	
+ 	vertex_data = glMapBuffer(GL_ARRAY_BUFFER, GL_WRITE_ONLY);
+ 	elem_data = glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
+ 	if (!vertex_data || !elem_data)
+ 		return 0;
+ 	
+ 	BM_mesh_elem_index_ensure(bm, BM_VERT);
+ 	
+ 	index_edge = 0;
+ 	BM_ITER_STRANDS(root, &iter, bm, BM_STRANDS_OF_MESH) {
+ 		BM_ITER_STRANDS_ELEM_INDEX(v, &iter_strand, root, BM_VERTS_OF_STRAND, k) {
+ 			size_t offset_co;
+ 			
+ 			index = BM_elem_index_get(v);
+ 			
+ 			offset_co = index * size_vertex;
+ 			copy_v3_v3((float *)(vertex_data + offset_co), v->co);
+ 			
+ 			if (k > 0) {
+ 				if (strands_use_normals(info)) {
+ 					size_t offset_nor = offset_co + size_v3;
+ 					float nor[3];
+ 					sub_v3_v3v3(nor, v->co, vprev->co);
+ 					normalize_v3(nor);
+ 					copy_v3_v3((float *)(vertex_data + offset_nor), nor);
+ 					
+ 					if (k == 1) {
+ 						/* define root normal: same as first segment */
+ 						size_t offset_root_nor = indexprev * size_vertex + size_v3;
+ 						copy_v3_v3((float *)(vertex_data + offset_root_nor), nor);
+ 					}
+ 				}
+ 				
+ 				{
+ 					elem_data[index_edge + 0] = indexprev;
+ 					elem_d

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list