[Bf-blender-cvs] [805ddc7] GPU_data_request: Merge branch 'master' into GPU_data_request

Antony Riakiotakis noreply at git.blender.org
Fri Apr 17 11:37:50 CEST 2015


Commit: 805ddc77905036c98788f9875c01adf2d44a2486
Author: Antony Riakiotakis
Date:   Fri Apr 17 11:37:34 2015 +0200
Branches: GPU_data_request
https://developer.blender.org/rB805ddc77905036c98788f9875c01adf2d44a2486

Merge branch 'master' into GPU_data_request

Conflicts:
	source/blender/makesdna/DNA_view3d_types.h

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



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

diff --cc source/blender/blenkernel/CMakeLists.txt
index 834ee2e,67c8f0f..f12e9d4
--- a/source/blender/blenkernel/CMakeLists.txt
+++ b/source/blender/blenkernel/CMakeLists.txt
@@@ -172,9 -173,7 +173,8 @@@ set(SR
  	intern/tracking_solver.c
  	intern/tracking_stabilize.c
  	intern/tracking_util.c
- 	intern/treehash.c
  	intern/unit.c
 +	intern/workflow_shaders.c
  	intern/world.c
  	intern/writeavi.c
  	intern/writeframeserver.c
@@@ -270,12 -272,8 +273,9 @@@
  	BKE_text.h
  	BKE_texture.h
  	BKE_tracking.h
- 	BKE_treehash.h
  	BKE_unit.h
  	BKE_utildefines.h
 +	BKE_workflow_shaders.h
  	BKE_world.h
  	BKE_writeavi.h
  	BKE_writeframeserver.h
diff --cc source/blender/blenkernel/intern/subsurf_ccg.c
index 6372c36,a4e0eaa..5727b7f
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@@ -1769,277 -1754,15 +1769,277 @@@ static void ccgDM_prepare_normal_data(D
  	int gridSize = ccgSubSurf_getGridSize(ss);
  	int gridFaces = gridSize - 1;
  	DMFlagMat *faceFlags = ccgdm->faceFlags;
 -	int step = (fast) ? gridSize - 1 : 1;
  	int i, totface = ccgSubSurf_getNumFaces(ss);
 -	int drawcurrent = 0, matnr = -1, shademodel = -1;
 +	int matnr, shademodel;
 +	int start;
 +
 +	CCG_key_top_level(&key, ss);
 +	ccgdm_pbvh_update(ccgdm);
 +
 +	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));
 +		short (*ln)[4][3] = NULL;
 +
 +		if (faceFlags) {
 +			shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
 +			matnr = faceFlags[index].mat_nr;
 +		}
 +		else {
 +			shademodel = GL_SMOOTH;
 +			matnr = 0;
 +		}
 +
 +		if (lnors) {
 +			ln = lnors;
 +			lnors += gridFaces * gridFaces * numVerts;
 +		}
 +
 +		for (S = 0; S < numVerts; S++) {
 +			CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 +
 +			if (ln) {
 +				/* Can't use quad strips here... */
 +				for (y = 0; y < gridFaces; y ++) {
 +					for (x = 0; x < gridFaces; x ++) {
 +						start = vindex[mat_orig_to_new[matnr]];
 +						
 +						normal_short_to_float_v3(&varray[start], ln[0][1]);
 +						normal_short_to_float_v3(&varray[start + 3], ln[0][2]);
 +						normal_short_to_float_v3(&varray[start + 6], ln[0][3]);
 +				
 +						normal_short_to_float_v3(&varray[start + 9], ln[0][3]);
 +						normal_short_to_float_v3(&varray[start + 12], ln[0][1]);
 +						normal_short_to_float_v3(&varray[start + 15], ln[0][0]);
 +						
 +						vindex[mat_orig_to_new[matnr]] += 18;
 +						
 +						ln ++;
 +					}
 +				}
 +			}
 +			else if (shademodel == GL_SMOOTH) {
 +				for (y = 0; y < gridFaces; y ++) {
 +					for (x = 0; x < gridFaces; x ++) {
 +						float *a = CCG_grid_elem_no(&key, faceGridData, x, y );
 +						float *b = CCG_grid_elem_no(&key, faceGridData, x + 1, y);
 +						float *c = CCG_grid_elem_no(&key, faceGridData, x + 1, y + 1);
 +						float *d = CCG_grid_elem_no(&key, faceGridData, x, y + 1);
 +
 +						start = vindex[mat_orig_to_new[matnr]];
 +						
 +						copy_v3_v3(&varray[start], d);
 +						copy_v3_v3(&varray[start + 3], c);
 +						copy_v3_v3(&varray[start + 6], b);
 +				
 +						copy_v3_v3(&varray[start + 9], d);
 +						copy_v3_v3(&varray[start + 12], b);
 +						copy_v3_v3(&varray[start + 15], a);
 +						
 +						vindex[mat_orig_to_new[matnr]] += 18;
 +					}
 +				}
 +			}
 +			else {
 +				for (y = 0; y < gridFaces; y ++) {
 +					for (x = 0; x < gridFaces; x ++) {
 +						float no[3];
 +						float *a = CCG_grid_elem_co(&key, faceGridData, x, y );
 +						float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y );
 +						float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 +						float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
 +
 +						ccgDM_NormalFast(a, b, c, d, no);
 +	
 +						start = vindex[mat_orig_to_new[matnr]];
 +						
 +						copy_v3_v3(&varray[start], no);
 +						copy_v3_v3(&varray[start + 3], no);
 +						copy_v3_v3(&varray[start + 6], no);
 +				
 +						copy_v3_v3(&varray[start + 9], no);
 +						copy_v3_v3(&varray[start + 12], no);
 +						copy_v3_v3(&varray[start + 15], no);
 +						
 +						vindex[mat_orig_to_new[matnr]] += 18;
 +					}
 +				}
 +			}
 +		}
 +	}
 +}
  
 +/* Only used by non-editmesh types */
 +static void ccgDM_prepare_vertex_data(DerivedMesh *dm, float *varray, int *vindex,
 +                                      int *mat_orig_to_new, void *UNUSED(user_data))
 +{
 +	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 +	CCGSubSurf *ss = ccgdm->ss;
 +	CCGKey key;
 +	int gridSize = ccgSubSurf_getGridSize(ss);
 +	int gridFaces = gridSize - 1;
 +	DMFlagMat *faceFlags = ccgdm->faceFlags;
 +	int i, totface = ccgSubSurf_getNumFaces(ss);
 +	int matnr = -1, start;
 +	
  	CCG_key_top_level(&key, ss);
  	ccgdm_pbvh_update(ccgdm);
 +	
 +	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));
 +		
 +		if (faceFlags) {
 +			matnr = faceFlags[index].mat_nr;
 +		}
 +		else {
 +			matnr = 0;
 +		}
 +		
 +		for (S = 0; S < numVerts; S++) {
 +			CCGElem *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
 +			for (y = 0; y < gridFaces; y++) {
 +				for (x = 0; x < gridFaces; x++) {
 +					float *a = CCG_grid_elem_co(&key, faceGridData, x, y);
 +					float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y);
 +					float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
 +					float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
 +
 +					start = vindex[mat_orig_to_new[matnr]];
 +					
 +					copy_v3_v3(&varray[start], d);
 +					copy_v3_v3(&varray[start + 3], c);
 +					copy_v3_v3(&varray[start + 6], b);
 +			
 +					copy_v3_v3(&varray[start + 9], d);
 +					copy_v3_v3(&varray[start + 12], b);
 +					copy_v3_v3(&varray[start + 15], a);
 +					
 +					vindex[mat_orig_to_new[matnr]] += 18;
 +				}
 +			}
 +		}
 +	}
 +}
 +
 +static void ccgDM_copy_gpu_data(DerivedMesh *dm, int type, float *varray, int *index,
 +                         int *mat_orig_to_new, void *UNUSED(user_data))
 +{	
 +	switch(type) {
 +		case GPU_BUFFER_VERTEX:
 +			ccgDM_prepare_vertex_data(dm, varray, index, mat_orig_to_new, NULL);
 +			break;
 +		case GPU_BUFFER_NORMAL:
 +			ccgDM_prepare_normal_data(dm, varray, index, mat_orig_to_new, NULL);
 +			break;
 +		default:
 +			break;
 +	}
 +}
 +
 +static GPUDrawObject *ccgDM_GPUObjectNew(DerivedMesh *dm) {
 +//	GPUBufferMaterial *mat;
 +	int *mat_orig_to_new;
 +	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
 +	CCGSubSurf *ss = ccgdm->ss;
 +	GPUDrawObject *gdo;
 +	DMFlagMat *faceFlags = ccgdm->faceFlags;
 +	int gridSize = ccgSubSurf_getGridSize(ss);
 +	int gridFaces = gridSize - 1;
 +	int totmat = (faceFlags) ? dm->totmat : 1;
 +	int *points_per_mat;
 +	int i, curmat, curpoint, totface;
 +
 +	/* object contains at least one material (default included) so zero means uninitialized dm */
 +	BLI_assert(totmat != 0);
 +
 +	totface = ccgSubSurf_getNumFaces(ss);
 +
 +	points_per_mat = MEM_callocN(sizeof(*points_per_mat) * totmat, "GPU_drawobject_new.mat_orig_to_new");
 +	
 +	if (faceFlags) {
 +		for (i = 0; i < totface; i++) {
 +			CCGFace *f = ccgdm->faceMap[i].face;
 +			int numVerts = ccgSubSurf_getFaceNumVerts(f);
 +			int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +			int new_matnr = faceFlags[index].mat_nr;
 +			points_per_mat[new_matnr] += numVerts * gridFaces * gridFaces * 6;
 +		}
 +	}
 +	else {
 +		for (i = 0; i < totface; i++) {
 +			points_per_mat[0] += gridFaces * gridFaces * 6;
 +		}
 +	}
 +	
 +	/* create the GPUDrawObject */
 +	gdo = MEM_callocN(sizeof(GPUDrawObject), "GPUDrawObject");
 +	gdo->totvert = ccgSubSurf_getNumFinalFaces(ss) * 6;
 +	gdo->totedge = ccgSubSurf_getNumFinalEdges(ss) * 2;
 +
 +	/* count the number of materials used by this DerivedMesh */
 +	for (i = 0; i < totmat; i++) {
 +		if (points_per_mat[i] > 0)
 +			gdo->totmaterial++;
 +	}
 +
 +	/* allocate an array of materials used by this DerivedMesh */
 +	gdo->materials = MEM_mallocN(sizeof(GPUBufferMaterial) * gdo->totmaterial,
 +	                             "GPUDrawObject.materials");
 +
 +	/* initialize the materials array */
 +	for (i = 0, curmat = 0, curpoint = 0; i < totmat; i++) {
 +		if (points_per_mat[i] > 0) {
 +			gdo->materials[curmat].start = curpoint;
 +			gdo->materials[curmat].totpoint = points_per_mat[i];
 +			gdo->materials[curmat].mat_nr = i;
 +
 +			curpoint += points_per_mat[i];
 +			curmat++;
 +		}
 +	}
 +
 +	/* store total number of points used for triangles */
 +	gdo->tot_triangle_point = curpoint;
 +
 +	mat_orig_to_new = MEM_callocN(sizeof(*mat_orig_to_new) * totmat,
 +	                                             "GPUDrawObject.mat_orig_to_new");
 +
 +	/* build a map from the original material indices to the new
 +	 * GPUBufferMaterial indices */
 +	for (i = 0; i < gdo->totmaterial; i++) {
 +		mat_orig_to_new[gdo->materials[i].mat_nr] = i;
 +		
 +	}
 +
 +	/*
 +	for (i = 0; i < totface; i++) {
 +		CCGFace *f = ccgdm->faceMap[i].face;
 +		int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
 +		int new_matnr = faceFlags[index].mat_nr;
 +	
 +		mat = &gdo->materials[mat_orig_to_new[new_matnr]];
 +
 +	}
 +	*/
 +
 +
 +	MEM_freeN(mat_orig_to_new);
 +	MEM_freeN(points_per_mat);
 +
 +	return gdo;
 +}
 +
 +/* Only used by non-editmesh types */
 +static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], bool fast, DMSetMaterial setMaterial)
 +{
 +	int a;
 +	CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
  
  	if (ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
- 		if (dm->numTessFaceData) {
+ 		if (BKE_pbvh_has_faces(ccgdm->pbvh)) {
  			BKE_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL,
  			              setMaterial, false);
  			glShadeModel(GL_FLAT);
diff --cc source/blender/editors/space_view3d/drawobject.c
index ae22f1c,ecc2499..d83613b
--- a/source/blender/editors/space_view3d/drawobject.c
+++ b/source/blender/editors/space_view3d/drawobject.c
@@@ -1872,251 -2092,13 +2097,256 @@@ static void drawcamera(Scene *scene, Vi
  			glPopMatrix();
  		}
  	}
+ 
+ 	/* ster

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list