[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60127] branches/soc-2013-bge/source: Simplifying the usage of BKE_object_lod_meshob_get and BKE_object_lod_matob_get , and cleaning up the code lod code in object.c.

Daniel Stokes kupomail at gmail.com
Sat Sep 14 02:32:58 CEST 2013


Revision: 60127
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60127
Author:   kupoman
Date:     2013-09-14 00:32:58 +0000 (Sat, 14 Sep 2013)
Log Message:
-----------
Simplifying the usage of BKE_object_lod_meshob_get and BKE_object_lod_matob_get, and cleaning up the code lod code in object.c.

The level of detail data now uses a bitfield for flags such as use_mesh and use_mat. The few files out there currently using levels of detail will need to renable those options.

Modified Paths:
--------------
    branches/soc-2013-bge/source/blender/blenkernel/BKE_object.h
    branches/soc-2013-bge/source/blender/blenkernel/intern/object.c
    branches/soc-2013-bge/source/blender/editors/space_view3d/drawobject.c
    branches/soc-2013-bge/source/blender/gpu/intern/gpu_draw.c
    branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h
    branches/soc-2013-bge/source/blender/makesrna/intern/rna_object.c
    branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp

Modified: branches/soc-2013-bge/source/blender/blenkernel/BKE_object.h
===================================================================
--- branches/soc-2013-bge/source/blender/blenkernel/BKE_object.h	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/blenkernel/BKE_object.h	2013-09-14 00:32:58 UTC (rev 60127)
@@ -88,8 +88,8 @@
 bool BKE_object_lod_remove(struct Object *ob, int level);
 bool BKE_object_lod_update(struct Object *ob, float camera_position[3]);
 bool BKE_object_lod_is_usable(struct Object *ob, struct Scene *scene);
-struct Object *BKE_object_lod_meshob_get(struct Object *ob);
-struct Object *BKE_object_lod_matob_get(struct Object *ob);
+struct Object *BKE_object_lod_meshob_get(struct Object *ob, struct Scene *scene);
+struct Object *BKE_object_lod_matob_get(struct Object *ob, struct Scene *scene);
 
 struct Object *BKE_object_copy_ex(struct Main *bmain, struct Object *ob, int copy_caches);
 struct Object *BKE_object_copy(struct Object *ob);

Modified: branches/soc-2013-bge/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/soc-2013-bge/source/blender/blenkernel/intern/object.c	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/blenkernel/intern/object.c	2013-09-14 00:32:58 UTC (rev 60127)
@@ -988,7 +988,7 @@
 	return ob;
 }
 
-void BKE_object_lod_add(struct Object *ob)
+void BKE_object_lod_add(Object *ob)
 {
 	LodLevel *lod = MEM_callocN(sizeof(LodLevel), "LoD Level");
 	LodLevel *last = ob->lodlevels.last;
@@ -997,18 +997,18 @@
 	if (!last) {
 		LodLevel *base = MEM_callocN(sizeof(LodLevel), "Base LoD Level");
 		BLI_addtail(&ob->lodlevels, base);
-		base->use_mat = base->use_mesh = 1;
+		base->flags = OB_LOD_USE_MESH | OB_LOD_USE_MAT;
 		base->source = ob;
 		last = ob->currentlod = base;
 	}
 	
 	lod->distance = last->distance + 25.0f;
-	lod->use_mesh = lod->use_mat = 1;
+	lod->flags = OB_LOD_USE_MESH | OB_LOD_USE_MAT;
 
 	BLI_addtail(&ob->lodlevels, lod);
 }
 
-bool BKE_object_lod_remove(struct Object *ob, int level)
+bool BKE_object_lod_remove(Object *ob, int level)
 {
 	LodLevel *rem;
 
@@ -1035,7 +1035,7 @@
 	return true;
 }
 
-static LodLevel* lod_level_select(struct Object *ob, float cam_loc[3])
+static LodLevel* lod_level_select(Object *ob, float cam_loc[3])
 {
 	LodLevel *current = ob->currentlod;
 	float ob_loc[3], delta[3];
@@ -1063,13 +1063,13 @@
 	return current;
 }
 
-bool BKE_object_lod_is_usable(struct Object *ob, struct Scene *scene)
+bool BKE_object_lod_is_usable(Object *ob, Scene *scene)
 {
 	bool active = (scene) ? ob == OBACT : 0;
 	return (ob->mode == OB_MODE_OBJECT || !active);
 }
 
-bool BKE_object_lod_update(struct Object *ob, float camera_position[3])
+bool BKE_object_lod_update(Object *ob, float camera_position[3])
 {
 	LodLevel* cur_level = ob->currentlod;
 	LodLevel* new_level = lod_level_select(ob, camera_position);
@@ -1082,32 +1082,28 @@
 	return false;
 }
 
-struct Object *BKE_object_lod_meshob_get(struct Object *ob)
+static Object *lod_ob_get(Object *ob, Scene *scene, int flag)
 {
 	LodLevel *current = ob->currentlod;
 
-	if (!current)
+	if (!current || !BKE_object_lod_is_usable(ob, scene))
 		return ob;
 
-	while( current->prev && (!current->use_mesh || !current->source || current->source->type != OB_MESH)) {
+	while( current->prev && (!(current->flags & flag) || !current->source || current->source->type != OB_MESH)) {
 		current = current->prev;
 	}
 
 	return current->source;
 }
 
-struct Object *BKE_object_lod_matob_get(struct Object *ob)
+struct Object *BKE_object_lod_meshob_get(Object *ob, Scene *scene)
 {
-	LodLevel *current = ob->currentlod;
+	return lod_ob_get(ob, scene, OB_LOD_USE_MESH);
+}
 
-	if (!current)
-		return ob;
-
-	while( current->prev && (!current->use_mat || !current->source || current->source->type != OB_MESH)) {
-		current = current->prev;
-	}
-
-	return current->source;
+struct Object *BKE_object_lod_matob_get(Object *ob, Scene *scene)
+{
+	return lod_ob_get(ob, scene, OB_LOD_USE_MAT);
 }
 
 SoftBody *copy_softbody(SoftBody *sb, int copy_caches)

Modified: branches/soc-2013-bge/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/soc-2013-bge/source/blender/editors/space_view3d/drawobject.c	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/editors/space_view3d/drawobject.c	2013-09-14 00:32:58 UTC (rev 60127)
@@ -3358,7 +3358,7 @@
 static void draw_mesh_fancy(Scene *scene, ARegion *ar, View3D *v3d, RegionView3D *rv3d, Base *base,
                             const char dt, const unsigned char ob_wire_col[4], const short dflag)
 {
-	Object *ob = base->object;
+	Object *ob = BKE_object_lod_meshob_get(base->object, scene);
 	Mesh *me = ob->data;
 	Material *ma = give_current_material(ob, 1);
 	const short hasHaloMat = (ma && (ma->material_type == MA_TYPE_HALO) && !BKE_scene_use_new_shading_nodes(scene));
@@ -3368,14 +3368,6 @@
 	const bool is_obact = (ob == OBACT);
 	int draw_flags = (is_obact && paint_facesel_test(ob)) ? DRAW_FACE_SELECT : 0;
 
-	if (BKE_object_lod_is_usable(ob, scene)) {
-		ob = BKE_object_lod_meshob_get(ob);
-		if (!ob) ob = base->object;
-		me = ob->data;
-		dm->release(dm);
-		dm = mesh_get_derived_final(scene, ob, scene->customdata_mask);
-	}
-
 	if (!dm)
 		return;
 

Modified: branches/soc-2013-bge/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/soc-2013-bge/source/blender/gpu/intern/gpu_draw.c	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/gpu/intern/gpu_draw.c	2013-09-14 00:32:58 UTC (rev 60127)
@@ -1389,10 +1389,7 @@
 	int new_shading_nodes = BKE_scene_use_new_shading_nodes(scene);
 	int use_matcap = (v3d->flag2 & V3D_SHOW_SOLID_MATCAP); /* assumes v3d->defmaterial->preview is set */
 
-	if (BKE_object_lod_is_usable(ob, scene)) {
-		Object *tmp = BKE_object_lod_matob_get(ob);
-		if (tmp) ob = tmp;
-	}
+	ob = BKE_object_lod_matob_get(ob, scene);
 	
 	/* initialize state */
 	memset(&GMS, 0, sizeof(GMS));

Modified: branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h
===================================================================
--- branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/makesdna/DNA_object_types.h	2013-09-14 00:32:58 UTC (rev 60127)
@@ -108,7 +108,7 @@
 typedef struct LodLevel {
 	struct LodLevel *next, *prev;
 	struct Object *source;
-	char use_mesh, use_mat, pad[2];
+	int flags;
 	float distance;
 } LodLevel;
 
@@ -480,7 +480,13 @@
 	OB_BOUND_CAPSULE       = 7,
 };
 
+/* lod flags */
+enum {
+	OB_LOD_USE_MESH		= 1 << 0,
+	OB_LOD_USE_MAT		= 1 << 1,
+};
 
+
 /* **************** BASE ********************* */
 
 /* also needed for base!!!!! or rather, they interfere....*/

Modified: branches/soc-2013-bge/source/blender/makesrna/intern/rna_object.c
===================================================================
--- branches/soc-2013-bge/source/blender/makesrna/intern/rna_object.c	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/blender/makesrna/intern/rna_object.c	2013-09-14 00:32:58 UTC (rev 60127)
@@ -2040,13 +2040,13 @@
 	RNA_def_property_update(prop, NC_LOD, NULL);
 
 	prop = RNA_def_property(srna, "use_mesh", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_sdna(prop, NULL, "use_mesh", 0);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", OB_LOD_USE_MESH);
 	RNA_def_property_ui_text(prop, "Use Mesh", "Use the mesh from this object at this level of detail");
 	RNA_def_property_ui_icon(prop, ICON_MESH_DATA, 0);
 	RNA_def_property_update(prop, NC_LOD, NULL);
 
 	prop = RNA_def_property(srna, "use_material", PROP_BOOLEAN, PROP_NONE);
-	RNA_def_property_boolean_sdna(prop, NULL, "use_mat", 0);
+	RNA_def_property_boolean_sdna(prop, NULL, "flags", OB_LOD_USE_MAT);
 	RNA_def_property_ui_text(prop, "Use Material", "Use the material from this object at this level of detail");
 	RNA_def_property_ui_icon(prop, ICON_MATERIAL, 0);
 	RNA_def_property_update(prop, NC_LOD, NULL);

Modified: branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-09-14 00:30:56 UTC (rev 60126)
+++ branches/soc-2013-bge/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2013-09-14 00:32:58 UTC (rev 60127)
@@ -2006,10 +2006,10 @@
 			gameobj->AddLodMesh(meshobj);
 			for (; lod; lod = lod->next) {
 				if (!lod->source || lod->source->type != OB_MESH) continue;
-				if (lod->use_mesh) {
+				if (lod->flags & OB_LOD_USE_MESH) {
 					lodmesh = static_cast<Mesh*>(lod->source->data);
 				}
-				if (lod->use_mat) {
+				if (lod->flags & OB_LOD_USE_MAT) {
 					lodmatob = lod->source;
 				}
 				gameobj->AddLodMesh(BL_ConvertMesh(lodmesh, lodmatob, kxscene, converter, libloading));




More information about the Bf-blender-cvs mailing list