[Bf-blender-cvs] [6abc947] opensubdiv-modifier: Merge branch 'master' into opensubdiv-modifier

Sergey Sharybin noreply at git.blender.org
Wed Jul 15 16:06:40 CEST 2015


Commit: 6abc9471811fb0f6622f1b8e4db97e2c00f9d073
Author: Sergey Sharybin
Date:   Wed Jul 15 16:06:26 2015 +0200
Branches: opensubdiv-modifier
https://developer.blender.org/rB6abc9471811fb0f6622f1b8e4db97e2c00f9d073

Merge branch 'master' into opensubdiv-modifier

Conflicts:
	source/blender/blenkernel/intern/subsurf_ccg.c
	source/blender/gpu/GPU_material.h

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



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

diff --cc source/blender/blenkernel/intern/subsurf_ccg.c
index 5d4932b,0b0c011..061f43b
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@@ -1793,167 -2255,18 +2271,82 @@@ static void ccgDM_drawFacesSolid(Derive
  
  		return;
  	}
 -	
 +
- 
 +#ifdef WITH_OPENSUBDIV
 +	if (ccgdm->useGpuBackend) {
++		const DMFlagMat *faceFlags = ccgdm->faceFlags;
++		const short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
++		CCGSubSurf *ss = ccgdm->ss;
 +		int i, matnr = -1, shademodel = -1;
 +		CCGFaceIterator fi;
 +		int start_partition = 0, num_partitions = 0;
 +		if (UNLIKELY(ccgSubSurf_prepareGLMesh(ss, setMaterial != NULL) == false)) {
 +			return;
 +		}
 +
 +		for (ccgSubSurf_initFaceIterator(ss, &fi), i = 0;
 +		     !ccgFaceIterator_isStopped(&fi);
 +		     ccgFaceIterator_next(&fi), ++i)
 +		{
 +			CCGFace *f = ccgFaceIterator_getCurrent(&fi);
 +			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +			int new_matnr, new_shademodel;
 +
 +			if (faceFlags) {
 +				new_shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH))
 +					? GL_SMOOTH
 +					: GL_FLAT;
 +				new_matnr = faceFlags[index].mat_nr;
 +			}
 +			else {
 +				new_shademodel = GL_SMOOTH;
 +				new_matnr = 0;
 +			}
 +
 +			if (new_shademodel != shademodel || new_matnr != matnr) {
 +				if (num_partitions) {
 +					ccgSubSurf_drawGLMesh(ss, true,
 +					                      start_partition, num_partitions);
 +				}
 +
 +				start_partition = i;
 +				num_partitions = 0;
 +
 +				/* Update material settings for the next partitions batch. */
 +				glShadeModel(new_shademodel);
 +				if (new_matnr != matnr && setMaterial) {
 +					setMaterial(new_matnr + 1, NULL);
 +				}
 +
 +				/* Cache settings. */
 +				shademodel = new_shademodel;
 +				matnr = new_matnr;
 +			}
 +
 +			num_partitions++;
 +		}
 +
 +		/* Draw residual tail of the partitions. */
 +		if (num_partitions) {
 +			ccgSubSurf_drawGLMesh(ss, true, start_partition, num_partitions);
 +		}
 +
 +		/* We're done with drawing if drawing happens using OpenSubdiv. */
 +		return;
 +	}
 +#endif
 +
- 	for (i = 0; i < totface; i++) {
- 		CCGFace *f = ccgdm->faceMap[i].face;
- 		int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
- 		int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
- 		int new_matnr, new_shademodel;
- 		short (*ln)[4][3] = NULL;
- 
- 		if (faceFlags) {
- 			new_shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
- 			new_matnr = faceFlags[index].mat_nr;
- 		}
- 		else {
- 			new_shademodel = GL_SMOOTH;
- 			new_matnr = 0;
- 		}
- 
- 		if (lnors) {
- 			ln = lnors;
- 			lnors += gridFaces * gridFaces * numVerts;
- 		}
- 
- 		if (shademodel != new_shademodel || matnr != new_matnr) {
- 			matnr = new_matnr;
- 			shademodel = new_shademodel;
- 
- 			if (setMaterial)
- 				drawcurrent = setMaterial(matnr + 1, NULL);
- 			else
- 				drawcurrent = 1;
- 
- 			glShadeModel(shademodel);
- 		}
- 
- 		if (!drawcurrent)
- 			continue;
- 
- 		for (S = 0; S < numVerts; S++) {
- 			CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
- 
- 			if (ln) {
- 				/* Can't use quad strips here... */
- 				glBegin(GL_QUADS);
- 				for (y = 0; y < gridFaces; y += step) {
- 					for (x = 0; x < gridFaces; x += step) {
- 						float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
- 						float *b = CCG_grid_elem_co(&key, faceGridData, x + step, y + 0);
- 						float *c = CCG_grid_elem_co(&key, faceGridData, x + step, y + step);
- 						float *d = CCG_grid_elem_co(&key, faceGridData, x, y + step);
- 
- 						glNormal3sv(ln[0][1]);
- 						glVertex3fv(d);
- 						glNormal3sv(ln[0][2]);
- 						glVertex3fv(c);
- 						glNormal3sv(ln[0][3]);
- 						glVertex3fv(b);
- 						glNormal3sv(ln[0][0]);
- 						glVertex3fv(a);
- 						ln += step;
- 					}
- 				}
- 				glEnd();
- 			}
- 			else if (shademodel == GL_SMOOTH) {
- 				for (y = 0; y < gridFaces; y += step) {
- 					glBegin(GL_QUAD_STRIP);
- 					for (x = 0; x < gridSize; x += step) {
- 						CCGElem *a = CCG_grid_elem(&key, faceGridData, x, y + 0);
- 						CCGElem *b = CCG_grid_elem(&key, faceGridData, x, y + step);
- 
- 						glNormal3fv(CCG_elem_no(&key, a));
- 						glVertex3fv(CCG_elem_co(&key, a));
- 						glNormal3fv(CCG_elem_no(&key, b));
- 						glVertex3fv(CCG_elem_co(&key, b));
- 					}
- 					glEnd();
- 				}
- 			}
- 			else {
- 				glBegin(GL_QUADS);
- 				for (y = 0; y < gridFaces; y += step) {
- 					for (x = 0; x < gridFaces; x += step) {
- 						float *a = CCG_grid_elem_co(&key, faceGridData, x, y + 0);
- 						float *b = CCG_grid_elem_co(&key, faceGridData, x + step, y + 0);
- 						float *c = CCG_grid_elem_co(&key, faceGridData, x + step, y + step);
- 						float *d = CCG_grid_elem_co(&key, faceGridData, x, y + step);
- 
- 						ccgDM_glNormalFast(a, b, c, d);
- 
- 						glVertex3fv(d);
- 						glVertex3fv(c);
- 						glVertex3fv(b);
- 						glVertex3fv(a);
- 					}
- 				}
- 				glEnd();
- 			}
+ 	GPU_vertex_setup(dm);
+ 	GPU_normal_setup(dm);
+ 	GPU_triangle_setup(dm);
+ 	glShadeModel(GL_SMOOTH);
+ 	for (a = 0; a < dm->drawObject->totmaterial; a++) {
+ 		if (!setMaterial || setMaterial(dm->drawObject->materials[a].mat_nr + 1, NULL)) {
+ 			GPU_buffer_draw_elements(dm->drawObject->triangles, GL_TRIANGLES, dm->drawObject->materials[a].start,
+ 			                         dm->drawObject->materials[a].totelements);
  		}
  	}
+ 	GPU_buffer_unbind();
  }
  
  /* Only used by non-editmesh types */
@@@ -2400,76 -2622,16 +2793,71 @@@ static void ccgDM_drawFacesTex_common(D
  	int colType = CD_TEXTURE_MCOL;
  	MCol *mcol = dm->getTessFaceDataArray(dm, colType);
  	MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
- 	MTFace *tf_stencil_base = NULL;
- 	MTFace *tf_stencil = NULL;
- 	MTFace *tf_base;
- 	short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
  	DMFlagMat *faceFlags = ccgdm->faceFlags;
  	DMDrawOption draw_option;
- 	int i, totface, gridSize = ccgSubSurf_getGridSize(ss);
- 	int gridFaces = gridSize - 1;
- 	int gridOffset = 0;
- 	int mat_nr_cache = -1;
- 
- 	/* TODO(sergey): Not currently supported, might lead to some wrong
- 	 * shading/texturing artifacts due to batching in OpenSubdiv.
- 	 */
- 	(void) compareDrawOptions;
+ 	int i, totpoly;
+ 	bool flush;
+ 	bool use_tface = (flag & DM_DRAW_USE_ACTIVE_UV) != 0;
+ 	unsigned int next_actualFace;
+ 	unsigned int gridFaces = ccgSubSurf_getGridSize(ss) - 1;
+ 	int mat_index;
+ 	int tot_element, start_element, tot_drawn;
  
 +#ifdef WITH_OPENSUBDIV
 +	if (ccgdm->useGpuBackend) {
++		const short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
 +		/* TODO(sergey): Do we have shorter way to do this? */
 +		int active = CustomData_get_active_layer(&ccgdm->dm.polyData,
 +		                                         CD_MTEXPOLY);
 +		MTexPoly *mtexpoly = CustomData_get_layer_n(&ccgdm->dm.polyData,
 +		                                            CD_MTEXPOLY,
 +		                                            active);
 +
 +		CCGFaceIterator fi;
 +
 +		/* TODO(sergey): Face-by-face for now, in order to optimize
 +		 * this we'll need to pass proper compareDrawOptions.
 +		 */
 +
 +		if (ccgSubSurf_prepareGLMesh(ss, true) == false) {
 +			return;
 +		}
 +
 +		for (ccgSubSurf_initFaceIterator(ss, &fi), i = 0;
 +		     !ccgFaceIterator_isStopped(&fi);
 +		     ccgFaceIterator_next(&fi), ++i)
 +		{
 +			CCGFace *f = ccgFaceIterator_getCurrent(&fi);
 +			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
- 			MTFace tmp_tf;
- 			int mat_nr;
 +			bool drawSmooth;
- 
- 			if (mtexpoly != NULL) {
- 				ME_MTEXFACE_CPY(&tmp_tf, &mtexpoly[index]);
++			MTexPoly tpoly;
++			int mat_nr;
++			if (tf) {
++				ME_MTEXFACE_CPY(&tpoly, &mtexpoly[index]);
 +			}
 +
 +			if (faceFlags) {
 +				drawSmooth = (lnors || (faceFlags[0].flag & ME_SMOOTH));
 +				mat_nr = faceFlags[0].mat_nr;
 +			}
 +			else {
 +				drawSmooth = 1;
 +				mat_nr = 0;
 +			}
 +
 +			glShadeModel(drawSmooth ? GL_SMOOTH : GL_FLAT);
 +
- 			if (drawParams != NULL && mtexpoly != NULL)
- 				drawParams(&tmp_tf, (mcol != NULL), mat_nr);
++			if (drawParams != NULL && mtexpoly != NULL) {
++				drawParams((use_tface && tf) ? &tpoly : NULL, (mcol != NULL), mat_nr);
++			}
 +
 +			ccgSubSurf_drawGLMesh(ss, true, i, 1);
 +		}
 +
 +		return;
 +	}
 +#endif
 +
  	CCG_key_top_level(&key, ss);
  	ccgdm_pbvh_update(ccgdm);
  
@@@ -3709,17 -3721,14 +3992,19 @@@ static void set_default_ccgdm_callbacks
  
  	ccgdm->dm.drawMappedEdgesInterp = ccgDM_drawMappedEdgesInterp;
  	ccgdm->dm.drawMappedEdges = ccgDM_drawMappedEdges;
+ 	ccgdm->dm.gpuObjectNew = ccgDM_GPUObjectNew;
+ 	ccgdm->dm.copy_gpu_data = ccgDM_copy_gpu_data;
  
  	ccgdm->dm.release = ccgDM_release;
 -	
 -	ccgdm->ss = ss;
 -	ccgdm->drawInteriorEdges = drawInteriorEdges;
 -	ccgdm->useSubsurfUv = useSubsurfUv;
 +}
 +
 +static void create_ccgdm_maps(CCGDerivedMesh *ccgdm,
 +                              CCGSubSurf *ss)
 +{
 +	CCGVertIterator vi;
 +	CCGEdgeIterator ei;
 +	CCGFaceIterator fi;
 +	int totvert, totedge, totface;
  
  	totvert = ccgSubSurf_getNumVerts(ss);
  	ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
diff --cc source/blender/gpu/GPU_material.h
index b5906bb,5995366..dd08ed8
--- a/source/blender/gpu/GPU_material.h
+++ b/source/blender/gpu/GPU_material.h
@@@ -308,12 -314,14 +314,20 @@@ void GPU_mist_update_values(int type, f
  void GPU_horizon_update_color(float color[3]);
  void GPU_ambient_update_color(float color[3]);
  
+ typedef struct GPUParticleInfo
+ {
+ 	float scalprops[4];
+ 	float location[3];
+ 	float velocity[3];
+ 	float angular_velocity[3];
+ } GPUParticleInfo;
+ 
 +#ifdef WITH_OPENSUBDIV
 +struct DerivedMesh;
 +void GPU_material_update_fvar_offset(GPUMaterial *gpu_material,
 +                                     struct DerivedMesh *dm);
 +#endif
 +
  #ifdef __cplusplus
  }
  #endif
diff --cc source/blender/gpu/intern/gpu_draw.c
index 3eae4d4,4e2af56..367dc66
--- a/source/blender/gpu/intern/gpu_draw.c
+++ b/source/blender/gpu/intern/gpu_draw.c
@@@ -1705,10 -1726,16 +1757,16 @@@ int GPU_enable_material(int nr, void *a
  		if (gattribs && GMS.gmatbuf[nr]) {
  			/* bind 

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list