[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53145] trunk/blender: BGE: Some as of yet unmerged work I did in the Swiss branch.

Mitchell Stokes mogurijin at gmail.com
Tue Dec 18 21:56:28 CET 2012


Revision: 53145
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53145
Author:   moguri
Date:     2012-12-18 20:56:25 +0000 (Tue, 18 Dec 2012)
Log Message:
-----------
BGE: Some as of yet unmerged work I did in the Swiss branch. These changes include:
  * Cleaning up the conversion code to avoid a per-face material conversion. Materials are now stored in buckets and only converted if a new material is found. This replaces some of Campbell's earlier work on the subject. His work wasn't as thorough, but it was much safer for a release.
  * Shaders are only compiled for LibLoaded materials once. Before they could be compiled twice, which could really slow things down.
  * Refactoring the rasterizer code to use a strategy design pattern to handle different geometry rendering methods such as immediate mode, vertex arrays and vertex buffer objects. VBOs are added, but they will be disabled in a following commit since they are still slower than vertex arrays with display lists. However, VBOs are still useful for mobile, so it's good to keep them around.
  * Better multi-uv support. The BGE should now be able to handle more than two UV layers, which should help it better match the viewport.

Modified Paths:
--------------
    trunk/blender/release/scripts/startup/bl_ui/properties_game.py
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.h
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.cpp
    trunk/blender/source/gameengine/Converter/KX_BlenderSceneConverter.h
    trunk/blender/source/gameengine/Converter/KX_ConvertActuators.cpp
    trunk/blender/source/gameengine/GamePlayer/ghost/GPG_Application.cpp
    trunk/blender/source/gameengine/Ketsji/BL_BlenderShader.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Material.cpp
    trunk/blender/source/gameengine/Ketsji/BL_Material.h
    trunk/blender/source/gameengine/Ketsji/BL_Texture.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_BlenderMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_ISceneConverter.h
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    trunk/blender/source/gameengine/Ketsji/KX_KetsjiEngine.h
    trunk/blender/source/gameengine/Ketsji/KX_MeshProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
    trunk/blender/source/gameengine/Ketsji/KX_PolygonMaterial.h
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.cpp
    trunk/blender/source/gameengine/Ketsji/KX_VertexProxy.h
    trunk/blender/source/gameengine/Rasterizer/RAS_BucketManager.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
    trunk/blender/source/gameengine/Rasterizer/RAS_IRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_MaterialBucket.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_MeshObject.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/CMakeLists.txt
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_ListRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
    trunk/blender/source/gameengine/Rasterizer/RAS_TexVert.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_TexVert.h
    trunk/blender/source/gameengine/Rasterizer/RAS_texmatrix.cpp

Added Paths:
-----------
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_IStorage.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageIM.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVA.h
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_StorageVBO.h

Removed Paths:
-------------
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp
    trunk/blender/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h

Modified: trunk/blender/release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2012-12-18 20:00:52 UTC (rev 53144)
+++ trunk/blender/release/scripts/startup/bl_ui/properties_game.py	2012-12-18 20:56:25 UTC (rev 53145)
@@ -402,15 +402,19 @@
         layout = self.layout
 
         gs = context.scene.game_settings
-
+        col = layout.column()
+        row = col.row()
+        col = row.column()
+        col.prop(gs, "use_frame_rate")
+        col.prop(gs, "restrict_animation_updates")
+        col = row.column()
+        col.prop(gs, "use_display_lists")
+        col.active = gs.raster_storage != 'VERTEX_BUFFER_OBJECT'
+		
         row = layout.row()
-        row.prop(gs, "use_frame_rate")
-        row.prop(gs, "restrict_animation_updates")
-
+        row.prop(gs, "raster_storage")
+        
         row = layout.row()
-        row.prop(gs, "use_display_lists")
-
-        row = layout.row()
         row.label("Exit Key")
         row.prop(gs, "exit_key", text="", event=True)
 

Modified: trunk/blender/source/blender/makesdna/DNA_scene_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_scene_types.h	2012-12-18 20:00:52 UTC (rev 53144)
+++ trunk/blender/source/blender/makesdna/DNA_scene_types.h	2012-12-18 20:56:25 UTC (rev 53145)
@@ -636,7 +636,8 @@
 	short physicsEngine;
 	short exitkey, pad;
 	short ticrate, maxlogicstep, physubstep, maxphystep;
-	short obstacleSimulation, pad1;
+	short obstacleSimulation;
+	short raster_storage;
 	float levelHeight;
 	float deactivationtime, lineardeactthreshold, angulardeactthreshold, pad2;
 } GameData;
@@ -663,6 +664,12 @@
 #define OBSTSIMULATION_TOI_rays		1
 #define OBSTSIMULATION_TOI_cells	2
 
+/* Raster storage */
+#define RAS_STORE_AUTO		0
+#define RAS_STORE_IMMEDIATE	1
+#define RAS_STORE_VA		2
+#define RAS_STORE_VBO		3
+
 /* GameData.flag */
 #define GAME_RESTRICT_ANIM_UPDATES			(1 << 0)
 #define GAME_ENABLE_ALL_FRAMES				(1 << 1)

Modified: trunk/blender/source/blender/makesrna/intern/rna_scene.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_scene.c	2012-12-18 20:00:52 UTC (rev 53144)
+++ trunk/blender/source/blender/makesrna/intern/rna_scene.c	2012-12-18 20:56:25 UTC (rev 53145)
@@ -2444,6 +2444,13 @@
 		{0, NULL, 0, NULL, NULL}
 	};
 
+	static EnumPropertyItem storage_items[] ={
+		{RAS_STORE_AUTO, "AUTO", 0, "Auto Select", "Chooses the best supported mode"},
+		{RAS_STORE_IMMEDIATE, "IMMEDIATE", 0, "Immediate Mode", "Slowest performance, requires OpenGL (any version)"},
+		{RAS_STORE_VA, "VERTEX_ARRAY", 0, "Vertex Arrays", "Moderate performance, requires at least OpenGL 1.1"},
+		{RAS_STORE_VBO, "VERTEX_BUFFER_OBJECT", 0, "Vertex Buffer Objects", "Best performance, requires at least OpenGL 1.4"},
+		{0, NULL, 0, NULL, NULL}};
+
 	srna = RNA_def_struct(brna, "SceneGameData", NULL);
 	RNA_def_struct_sdna(srna, "GameData");
 	RNA_def_struct_nested(brna, srna, "Scene");
@@ -2479,6 +2486,12 @@
 	RNA_def_property_ui_text(prop, "Exit Key",  "The key that exits the Game Engine");
 	RNA_def_property_update(prop, NC_SCENE, NULL);
 	
+	prop= RNA_def_property(srna, "raster_storage", PROP_ENUM, PROP_NONE);
+	RNA_def_property_enum_sdna(prop, NULL, "raster_storage");
+	RNA_def_property_enum_items(prop, storage_items);
+	RNA_def_property_ui_text(prop, "Storage",  "Sets the storage mode used by the rasterizer");
+	RNA_def_property_update(prop, NC_SCENE, NULL);
+	
 	/* Do we need it here ? (since we already have it in World */
 	prop = RNA_def_property(srna, "frequency", PROP_INT, PROP_NONE);
 	RNA_def_property_int_sdna(prop, NULL, "freqplay");

Modified: trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-12-18 20:00:52 UTC (rev 53144)
+++ trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2012-12-18 20:56:25 UTC (rev 53145)
@@ -58,7 +58,6 @@
 
 #include "RAS_GLExtensionManager.h"
 #include "RAS_OpenGLRasterizer.h"
-#include "RAS_VAOpenGLRasterizer.h"
 #include "RAS_ListRasterizer.h"
 
 #include "NG_LoopBackNetworkDeviceInterface.h"
@@ -287,16 +286,12 @@
 		RAS_IRenderTools* rendertools = new KX_BlenderRenderTools();
 		RAS_IRasterizer* rasterizer = NULL;
 		
-		if (displaylists) {
-			if (GLEW_VERSION_1_1 && !novertexarrays)
-				rasterizer = new RAS_ListRasterizer(canvas, true, true);
-			else
-				rasterizer = new RAS_ListRasterizer(canvas);
-		}
-		else if (GLEW_VERSION_1_1 && !novertexarrays)
-			rasterizer = new RAS_VAOpenGLRasterizer(canvas, false);
+		//Don't use displaylists with VBOs
+		//If auto starts using VBOs, make sure to check for that here
+		if (displaylists && startscene->gm.raster_storage != RAS_STORE_VBO)
+			rasterizer = new RAS_ListRasterizer(canvas, true, startscene->gm.raster_storage);
 		else
-			rasterizer = new RAS_OpenGLRasterizer(canvas);
+			rasterizer = new RAS_OpenGLRasterizer(canvas, startscene->gm.raster_storage);
 		
 		// create the inputdevices
 		KX_BlenderKeyboardDevice* keyboarddevice = new KX_BlenderKeyboardDevice();

Modified: trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp
===================================================================
--- trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-12-18 20:00:52 UTC (rev 53144)
+++ trunk/blender/source/gameengine/Converter/BL_BlenderDataConversion.cpp	2012-12-18 20:56:25 UTC (rev 53145)
@@ -423,56 +423,62 @@
 
 
 // --
-static void GetRGB(
-        const bool use_mcol,
-        MFace *mface,
-        MCol *mmcol,
-        Material *mat,
-        unsigned int &c0,
-        unsigned int &c1,
-        unsigned int &c2,
-        unsigned int &c3)
+static void GetRGB(short type,
+	MFace* mface,
+	MCol* mmcol,
+	Material *mat,
+	unsigned int c[4])
 {
 	unsigned int color = 0xFFFFFFFFL;
-	if (use_mcol) {
-		// vertex colors
-
-		if (mmcol) {
-			c0 = KX_Mcol2uint_new(mmcol[0]);
-			c1 = KX_Mcol2uint_new(mmcol[1]);
-			c2 = KX_Mcol2uint_new(mmcol[2]);
+	switch (type) {
+		case 0:	// vertex colors
+		{
+			if (mmcol) {
+				c[0] = KX_Mcol2uint_new(mmcol[0]);
+				c[1] = KX_Mcol2uint_new(mmcol[1]);
+				c[2] = KX_Mcol2uint_new(mmcol[2]);
+				if (mface->v4)
+					c[3] = KX_Mcol2uint_new(mmcol[3]);
+			}
+			else { // backup white
+				c[0] = KX_rgbaint2uint_new(color);
+				c[1] = KX_rgbaint2uint_new(color);
+				c[2] = KX_rgbaint2uint_new(color);
+				if (mface->v4)
+					c[3] = KX_rgbaint2uint_new( color );
+			}
+		} break;
+		
+	
+		case 1: // material rgba
+		{
+			if (mat) {
+				union {
+					unsigned char cp[4];
+					unsigned int integer;
+				} col_converter;
+				col_converter.cp[3] = (unsigned char) (mat->r     * 255.0f);
+				col_converter.cp[2] = (unsigned char) (mat->g     * 255.0f);
+				col_converter.cp[1] = (unsigned char) (mat->b     * 255.0f);
+				col_converter.cp[0] = (unsigned char) (mat->alpha * 255.0f);
+				color = col_converter.integer;
+			}
+			c[0] = KX_rgbaint2uint_new(color);
+			c[1] = KX_rgbaint2uint_new(color);
+			c[2] = KX_rgbaint2uint_new(color);
 			if (mface->v4)
-				c3 = KX_Mcol2uint_new(mmcol[3]);
-		}
-		else { // backup white
-			c0 = KX_rgbaint2uint_new(color);
-			c1 = KX_rgbaint2uint_new(color);
-			c2 = KX_rgbaint2uint_new(color);
+				c[3] = KX_rgbaint2uint_new(color);
+		} break;
+		
+		default: // white
+		{
+			c[0] = KX_rgbaint2uint_new(color);
+			c[1] = KX_rgbaint2uint_new(color);
+			c[2] = KX_rgbaint2uint_new(color);
 			if (mface->v4)
-				c3 = KX_rgbaint2uint_new( color );
-		}
+				c[3] = KX_rgbaint2uint_new(color);
+		} break;
 	}
-	else {
-		// material rgba
-		if (mat) {
-			union {
-				unsigned char cp[4];
-				unsigned int integer;
-			} col_converter;
-			col_converter.cp[3] = (unsigned char) (mat->r     * 255.0f);
-			col_converter.cp[2] = (unsigned char) (mat->g     * 255.0f);
-			col_converter.cp[1] = (unsigned char) (mat->b     * 255.0f);
-			col_converter.cp[0] = (unsigned char) (mat->alpha * 255.0f);
-			color = col_converter.integer;
-		}
-		// backup white is fallback
-
-		c0 = KX_rgbaint2uint_new(color);
-		c1 = KX_rgbaint2uint_new(color);
-		c2 = KX_rgbaint2uint_new(color);
-		if (mface->v4)
-			c3 = KX_rgbaint2uint_new(color);
-	}
 }
 
 typedef struct MTF_localLayer {
@@ -480,43 +486,68 @@
 	const char *name;
 } MTF_localLayer;
 
-static void tface_to_uv_bge(const MFace *mface, const MTFace *tface, MT_Point2 uv[4])
+static void GetUVs(BL_Material *material, MTF_localLayer *layers, MFace *mface, MTFace *tface, MT_Point2 uvs[4][MAXTEX])
 {
-	uv[0].setValue(tface->uv[0]);
-	uv[1].setValue(tface->uv[1]);
-	uv[2].setValue(tface->uv[2]);
-	if (mface->v4) {
-		uv[3].setValue(tface->uv[3]);
+	int unit = 0;
+	if (tface)
+	{
+			
+		uvs[0][0].setValue(tface->uv[0]);
+		uvs[1][0].setValue(tface->uv[1]);
+		uvs[2][0].setValue(tface->uv[2]);
+
+		if (mface->v4) 
+			uvs[3][0].setValue(tface->uv[3]);
 	}
-}
+	else
+	{
+		uvs[0][0] = uvs[1][0] = uvs[2][0] = uvs[3][0] = MT_Point2(0.f, 0.f);
+	}
+	
+	for (int vind = 0; vind<MAXTEX; vind++)
+	{
+		BL_Mapping &map = material->mapping[vind];
 
-static void GetUV(
-        MFace *mface,
-        MTFace *tface,
-        MTF_localLayer *layers,
-        const int layer_uv[2],
-        MT_Point2 uv[4],
-        MT_Point2 uv2[4])
-{
-	bool validface	= (tface != NULL);
+		if (!(map.mapping & USEUV)) continue;
 
-	uv2[0] = uv2[1] = uv2[2] = uv2[3] = MT_Point2(0.0f, 0.0f);
+		//If no UVSet is specified, try grabbing one from the UV/Image editor
+		if (map.uvCoName.IsEmpty() && tface)
+		{			
+			uvs[0][unit].setValue(tface->uv[0]);
+			uvs[1][unit].setValue(tface->uv[1]);
+			uvs[2][unit].setValue(tface->uv[2]);
 
-	/* No material, what to do? let's see what is in the UV and set the material accordingly
-	 * light and visible is always on */
-	if (layer_uv[0] != -1) {
-		tface_to_uv_bge(mface, layers[layer_uv[0]].face, uv);
-		if (layer_uv[1] != -1) {
-			tface_to_uv_bge(mface, layers[layer_uv[1]].face, uv2);
+			if (mface->v4) 
+				uvs[3][unit].setValue(tface->uv[3]);
+
+			++unit;
+			continue;
 		}
+
+
+		for (int lay=0; lay<MAX_MTFACE; lay++)
+		{
+			MTF_localLayer& layer = layers[lay];
+			if (layer.face == 0) break;
+
+			if (map.uvCoName.IsEmpty() || strcmp(map.uvCoName.ReadPtr(), layer.name)==0)
+			{
+				MT_Point2 uvSet[4];

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list