[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [20685] branches/bb_dev: LOD system part 1 : UI+backend for multiple mesh selection per object.

Benoit Bolsee benoit.bolsee at online.be
Sat Jun 6 21:50:13 CEST 2009


Revision: 20685
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=20685
Author:   ben2610
Date:     2009-06-06 21:50:09 +0200 (Sat, 06 Jun 2009)

Log Message:
-----------
LOD system part 1: UI+backend for multiple mesh selection per object.

Modified Paths:
--------------
    branches/bb_dev/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
    branches/bb_dev/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj
    branches/bb_dev/source/blender/blenkernel/intern/mesh.c
    branches/bb_dev/source/blender/blenkernel/intern/object.c
    branches/bb_dev/source/blender/blenloader/intern/readfile.c
    branches/bb_dev/source/blender/blenloader/intern/writefile.c
    branches/bb_dev/source/blender/include/butspace.h
    branches/bb_dev/source/blender/makesdna/DNA_object_types.h
    branches/bb_dev/source/blender/makesdna/intern/makesdna.c
    branches/bb_dev/source/blender/src/buttons_editing.c
    branches/bb_dev/source/blender/src/editobject.c

Added Paths:
-----------
    branches/bb_dev/source/blender/blenkernel/BKE_lod.h
    branches/bb_dev/source/blender/blenkernel/intern/lod.c
    branches/bb_dev/source/blender/makesdna/DNA_lod_types.h

Modified: branches/bb_dev/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj
===================================================================
--- branches/bb_dev/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj	2009-06-06 19:32:18 UTC (rev 20684)
+++ branches/bb_dev/projectfiles_vc9/blender/blenkernel/BKE_blenkernel.vcproj	2009-06-06 19:50:09 UTC (rev 20685)
@@ -4,6 +4,7 @@
 	Version="9,00"
 	Name="BKE_blenkernel"
 	ProjectGUID="{CAE37E91-6570-43AC-A4B4-7A37A4B0FC94}"
+	RootNamespace="BKE_blenkernel"
 	TargetFrameworkVersion="131072"
 	>
 	<Platforms>
@@ -629,6 +630,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenkernel\intern\lod.c"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenkernel\intern\material.c"
 				>
 			</File>
@@ -930,6 +935,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\blenkernel\BKE_lod.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\blenkernel\BKE_main.h"
 				>
 			</File>

Modified: branches/bb_dev/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj
===================================================================
--- branches/bb_dev/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj	2009-06-06 19:32:18 UTC (rev 20684)
+++ branches/bb_dev/projectfiles_vc9/blender/makesdna/DNA_makesdna.vcproj	2009-06-06 19:50:09 UTC (rev 20685)
@@ -689,6 +689,10 @@
 				>
 			</File>
 			<File
+				RelativePath="..\..\..\source\blender\makesdna\DNA_lod_types.h"
+				>
+			</File>
+			<File
 				RelativePath="..\..\..\source\blender\makesdna\DNA_material_types.h"
 				>
 			</File>

Added: branches/bb_dev/source/blender/blenkernel/BKE_lod.h
===================================================================
--- branches/bb_dev/source/blender/blenkernel/BKE_lod.h	                        (rev 0)
+++ branches/bb_dev/source/blender/blenkernel/BKE_lod.h	2009-06-06 19:50:09 UTC (rev 20685)
@@ -0,0 +1,68 @@
+/**
+ *	
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation.
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+#ifndef BKE_LOD_H
+#define BKE_LOD_H
+
+struct bLodLevel;
+struct Object;
+struct ID;
+struct ListBase;
+
+
+/* allocates and initializes general main data */
+extern struct bLodLevel *lodNew(void);
+
+/* frees internal data and lod level itself */
+extern void	lodFree(struct bLodLevel *sb);
+
+/* duplicate lod level plus internal data, maintain use count */
+struct bLodLevel *lodCopy(struct bLodLevel *lod);
+
+/* return the current level according ob->lodlevel */
+struct bLodLevel *lodGetCurrent(struct Object *ob);
+
+/* replace the data block in the current lod level, maintain usage count */
+void lodUpdateCurrent(struct Object *ob, struct ID *newid);
+
+/* remove current lod level and make next one current */
+void lodDeleteCurrent(struct Object *ob);
+
+/* returns the number of LOD levels */
+int lodLevelCount(struct Object *ob);
+
+/* make the object data pointed by current LOD level the active object data.
+   returns 1 if object data was changed */
+int lodChangeLevel(struct Object *ob, short newlevel);
+
+void free_lodlevels(struct ListBase *lb);
+void copy_lodlevels(struct ListBase *lbn, struct ListBase *lbo);
+
+#endif
+


Property changes on: branches/bb_dev/source/blender/blenkernel/BKE_lod.h
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Added: branches/bb_dev/source/blender/blenkernel/intern/lod.c
===================================================================
--- branches/bb_dev/source/blender/blenkernel/intern/lod.c	                        (rev 0)
+++ branches/bb_dev/source/blender/blenkernel/intern/lod.c	2009-06-06 19:50:09 UTC (rev 20685)
@@ -0,0 +1,197 @@
+/*  
+ * 
+ * $Id$
+ *
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+ *
+ * The Original Code is Copyright (C) Blender Foundation
+ * All rights reserved.
+ *
+ * The Original Code is: all of this file.
+ *
+ * Contributor(s): none yet.
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+#include "MEM_guardedalloc.h"
+
+/* types */
+#include "DNA_lod_types.h"
+#include "DNA_object_types.h"
+#include "DNA_ID.h"
+#include "DNA_mesh_types.h"
+
+#include "BKE_library.h"
+#include "BKE_mesh.h"
+#include "BKE_lod.h"
+#include "BKE_utildefines.h"
+
+#include "BLI_blenlib.h"
+
+/* ************ Object level, exported functions *************** */
+
+/* allocates and initializes general main data */
+bLodLevel *lodNew(void)
+{
+	bLodLevel *lod;
+	
+	lod= MEM_callocN(sizeof(bLodLevel), "bLodLevel");
+		
+	return lod;
+}
+
+/* frees all */
+void lodFree(bLodLevel *lod)
+{
+	if (lod->flag & LOD_US) {
+		ID *id = lod->data;
+		id->us--;
+		if (id->us == 0) {
+			switch (GS(id->name)) {
+			case ID_ME:
+				unlink_mesh((Mesh*)id);
+				break;
+			}
+		}
+	}
+	MEM_freeN(lod);
+}
+
+bLodLevel *lodCopy(bLodLevel *lod)
+{
+	bLodLevel *lodn;
+	
+	lodn= MEM_dupallocN(lod);
+	if (lodn->flag & LOD_US)
+		id_us_plus((ID *)lodn->data);
+	return lodn;
+}
+
+int lodLevelCount(Object *ob)
+{
+	return BLI_countlist(&ob->lodlevels);
+}
+
+int lodChangeLevel(Object *ob, short newlevel)
+{
+	bLodLevel *lod = lodGetCurrent(ob);
+	if (!lod || 
+		ob->lodlevel == newlevel ||
+		newlevel >= lodLevelCount(ob) || 
+		newlevel < 0)
+		return 0;
+	if (!(lod->flag & LOD_US) && lod->data) {
+		/* there is only one level without LOD_US, if we leave it, must increment the count */
+		id_us_plus((ID *)lod->data);
+		lod->flag |= LOD_US;
+	}
+	ob->lodlevel = newlevel;
+	lod = lodGetCurrent(ob);
+	if (lod->data) {
+		if (lod->data == ob->data) {
+			if (lod->flag & LOD_US) {
+				((ID *)lod->data)->us--;
+				lod->flag &= ~LOD_US;
+			}
+			return 0;
+		}
+		switch (ob->type) {
+		case OB_MESH:
+			set_mesh(ob, lod->data);
+			return 1;
+		}
+	}
+	return 0;
+}
+
+bLodLevel *lodGetCurrent(Object *ob)
+{
+	short lodlevel;
+	bLodLevel *lod;
+	for (lodlevel=0, lod=ob->lodlevels.first; lodlevel!=ob->lodlevel && lod; lod=lod->next, ++lodlevel);
+	if (!lod) {
+		/* reached the end without finding the correct level, use last */
+		lod = ob->lodlevels.last;
+		if (lodlevel)
+			--lodlevel;
+		ob->lodlevel = lodlevel;
+	}
+	return lod;
+}
+
+void lodUpdateCurrent(Object *ob, ID *newid)
+{
+	bLodLevel *lod = lodGetCurrent(ob);
+	ID *old;
+
+	if (lod) {
+		old =lod->data;
+		if (old && (lod->flag & LOD_US))
+			old->us--;
+		lod->data= newid;
+		if (newid == ob->data)
+			lod->flag &= ~LOD_US;
+		else {
+			lod->flag |= LOD_US;
+			id_us_plus(newid);
+		}
+	}
+}
+
+void lodDeleteCurrent(struct Object *ob)
+{
+	bLodLevel *lod = lodGetCurrent(ob);
+	short newlevel;
+
+	if (lod) {
+		if (lod->next) {
+			newlevel = ob->lodlevel+1;
+		} else if (lod->prev) {
+			newlevel = ob->lodlevel-1;
+		} else {
+			newlevel = -1;
+		}
+		lodChangeLevel(ob, newlevel);
+		BLI_remlink(&ob->lodlevels, lod);
+		lodFree(lod);
+		lodGetCurrent(ob);
+	}
+}
+
+void free_lodlevels(ListBase *lb)
+{
+	bLodLevel *lod;
+
+	while((lod= lb->first)) {
+		BLI_remlink(lb, lod);
+		lodFree(lod);
+	}
+}
+
+void copy_lodlevels(struct ListBase *lbn, struct ListBase *lbo)
+{
+	bLodLevel *lod, *lodn;
+	
+	lbn->first= lbn->last= 0;
+	lod= lbo->first;
+	while(lod) {
+		lodn= lodCopy(lod);
+		BLI_addtail(lbn, lodn);
+		lod= lod->next;
+	}
+}


Property changes on: branches/bb_dev/source/blender/blenkernel/intern/lod.c
___________________________________________________________________
Name: svn:keywords
   + Author Date Id Revision
Name: svn:eol-style
   + native

Modified: branches/bb_dev/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bb_dev/source/blender/blenkernel/intern/mesh.c	2009-06-06 19:32:18 UTC (rev 20684)
+++ branches/bb_dev/source/blender/blenkernel/intern/mesh.c	2009-06-06 19:50:09 UTC (rev 20685)
@@ -70,6 +70,7 @@
 #include "BKE_object.h"
 #include "BKE_utildefines.h"
 #include "BKE_bad_level_calls.h"
+#include "BKE_lod.h"
 
 #ifdef WITH_VERSE
 #include "BKE_verse.h"
@@ -553,6 +554,7 @@
 		old->id.us--;
 		ob->data= me;
 		id_us_plus((ID *)me);
+		lodUpdateCurrent(ob, (ID *)me);
 	}
 	
 	test_object_materials((ID *)me);

Modified: branches/bb_dev/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/bb_dev/source/blender/blenkernel/intern/object.c	2009-06-06 19:32:18 UTC (rev 20684)
+++ branches/bb_dev/source/blender/blenkernel/intern/object.c	2009-06-06 19:50:09 UTC (rev 20685)
@@ -108,6 +108,7 @@
 #include "BKE_scene.h"
 #include "BKE_screen.h"
 #include "BKE_softbody.h"
+#include "BKE_lod.h"
 
 #include "LBM_fluidsim.h"
 
@@ -267,7 +268,8 @@
 	free_sensors(&ob->sensors);
 	free_controllers(&ob->controllers);
 	free_actuators(&ob->actuators);
-	
+	free_lodlevels(&ob->lodlevels);
+
 	free_constraints(&ob->constraints);
 	free_constraint_channels(&ob->constraintChannels);
 	free_nlastrips(&ob->nlastrips);
@@ -1227,7 +1229,8 @@

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list