[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16195] branches/apricot/source: Apricot Branch

Brecht Van Lommel brechtvanlommel at pandora.be
Wed Aug 20 18:29:55 CEST 2008


Revision: 16195
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16195
Author:   blendix
Date:     2008-08-20 18:29:55 +0200 (Wed, 20 Aug 2008)

Log Message:
-----------
Apricot Branch
==============

* Make lights and shadows work better with dupligroups, also in
  the game engine. Previously only one dupli would be created,
  and shadows didn't work well at all.
* Make normal maps + stencil work.
* Some glsl refresh and default material fixes.

Modified Paths:
--------------
    branches/apricot/source/blender/blenkernel/intern/material.c
    branches/apricot/source/blender/blenkernel/intern/object.c
    branches/apricot/source/blender/blenloader/intern/readfile.c
    branches/apricot/source/blender/gpu/GPU_material.h
    branches/apricot/source/blender/gpu/intern/gpu_codegen.c
    branches/apricot/source/blender/gpu/intern/gpu_draw.c
    branches/apricot/source/blender/gpu/intern/gpu_material.c
    branches/apricot/source/blender/makesdna/DNA_object_types.h
    branches/apricot/source/blender/src/drawscene.c
    branches/apricot/source/blender/src/drawview.c
    branches/apricot/source/blender/src/previewrender.c
    branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.cpp
    branches/apricot/source/gameengine/Ketsji/KX_GameObject.h
    branches/apricot/source/gameengine/Ketsji/KX_KetsjiEngine.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Light.cpp
    branches/apricot/source/gameengine/Ketsji/KX_Light.h
    branches/apricot/source/gameengine/Ketsji/KX_Scene.cpp

Modified: branches/apricot/source/blender/blenkernel/intern/material.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/material.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/blenkernel/intern/material.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -100,7 +100,7 @@
 	}
 
 	if(ma->gpumaterial)
-		GPU_material_free(ma->gpumaterial);
+		GPU_material_free(ma);
 }
 
 void init_material(Material *ma)

Modified: branches/apricot/source/blender/blenkernel/intern/object.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/object.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/blenkernel/intern/object.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -270,7 +270,7 @@
 	}
 	if(ob->soft) sbFree(ob->soft);
 	if(ob->fluidsimSettings) fluidsimSettingsFree(ob->fluidsimSettings);
-	if(ob->gpulamp) GPU_lamp_free(ob->gpulamp);
+	if(ob->gpulamp.first) GPU_lamp_free(ob);
 }
 
 static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
@@ -1229,7 +1229,7 @@
 	obn->vnode = NULL;
 #endif
 
-	obn->gpulamp = NULL;
+	obn->gpulamp.first = obn->gpulamp.last = NULL;
 
 	return obn;
 }

Modified: branches/apricot/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/apricot/source/blender/blenloader/intern/readfile.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/blenloader/intern/readfile.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -3400,7 +3400,7 @@
 	ob->bb= NULL;
 	ob->derivedDeform= NULL;
 	ob->derivedFinal= NULL;
-	ob->gpulamp= NULL;
+	ob->gpulamp.first= ob->gpulamp.last= NULL;
 }
 
 /* ************ READ SCENE ***************** */

Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/gpu/GPU_material.h	2008-08-20 16:29:55 UTC (rev 16195)
@@ -120,7 +120,7 @@
 /* High level functions to create and use GPU materials */
 
 int GPU_material_from_blender(struct Scene *scene, struct Material *ma);
-void GPU_material_free(GPUMaterial *material);
+void GPU_material_free(struct Material *ma);
 
 void GPU_materials_free();
 
@@ -151,8 +151,8 @@
 
 /* Lamps */
 
-int GPU_lamp_from_blender(struct Object *ob, struct Lamp *la);
-void GPU_lamp_free(GPULamp *lamp);
+GPULamp *GPU_lamp_from_blender(struct Object *ob, struct Object *par);
+void GPU_lamp_free(struct Object *ob);
 
 int GPU_lamp_has_shadow_buffer(GPULamp *lamp);
 void GPU_lamp_shadow_buffer_bind(GPULamp *lamp, float viewmat[][4], int *winsize, float winmat[][4]);

Modified: branches/apricot/source/blender/gpu/intern/gpu_codegen.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/gpu/intern/gpu_codegen.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -362,10 +362,8 @@
 {
 	extern Material defmaterial;    // render module abuse...
 
-	if(defmaterial.gpumaterial) {
-		GPU_material_free(defmaterial.gpumaterial);
-		defmaterial.gpumaterial = NULL;
-	}
+	if(defmaterial.gpumaterial)
+		GPU_material_free(&defmaterial);
 
 	if(FUNCTION_HASH) {
 		BLI_ghash_free(FUNCTION_HASH, NULL, (GHashValFreeFP)MEM_freeN);

Modified: branches/apricot/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_draw.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/gpu/intern/gpu_draw.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -798,7 +798,12 @@
 		QUATCOPY(GMS.matbuf[1][0], GMS.matbuf[0][0]);
 		QUATCOPY(GMS.matbuf[1][1], GMS.matbuf[0][1]);
 
-		GMS.gmatbuf[0]= NULL;
+		if(glsl) {
+			GMS.gmatbuf[0]= &defmaterial;
+			GPU_material_from_blender(GMS.gscene, &defmaterial);
+		}
+
+		GMS.blendmode[0]= GPU_BLEND_SOLID;
 	}
 	
 	/* setup materials */

Modified: branches/apricot/source/blender/gpu/intern/gpu_material.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-08-20 06:11:11 UTC (rev 16194)
+++ branches/apricot/source/blender/gpu/intern/gpu_material.c	2008-08-20 16:29:55 UTC (rev 16195)
@@ -100,6 +100,7 @@
 
 struct GPULamp {
 	Object *ob;
+	Object *par;
 	Lamp *la;
 
 	int type, mode, lay;
@@ -216,14 +217,20 @@
 	return 0;
 }
 
-void GPU_material_free(GPUMaterial *material)
+void GPU_material_free(Material *ma)
 {
-	if(material->pass)
-		GPU_pass_free(material->pass);
+	GPUMaterial *material = ma->gpumaterial;
 
-	BLI_linklist_free(material->lamps, NULL);
+	if(material) {
+		if(material->pass)
+			GPU_pass_free(material->pass);
 
-	MEM_freeN(material);
+		BLI_linklist_free(material->lamps, NULL);
+
+		MEM_freeN(material);
+
+		ma->gpumaterial = NULL;
+	}
 }
 
 void GPU_material_bind(GPUMaterial *material, int lay, double time)
@@ -729,14 +736,15 @@
 	Base *base;
 	Object *ob;
 	Scene *sce;
+	GPULamp *lamp;
 	
 	for(SETLOOPER(shi->gpumat->scene, base)) {
 		ob= base->object;
 
 		if(ob->type==OB_LAMP) {
-			GPU_lamp_from_blender(ob, ob->data);
-			if(ob->gpulamp)
-				shade_one_light(shi, shr, ob->gpulamp);
+			lamp = GPU_lamp_from_blender(ob, NULL);
+			if(lamp)
+				shade_one_light(shi, shr, lamp);
 		}
 
 		if (ob->transflag & OB_DUPLI) {
@@ -749,9 +757,9 @@
 				if(ob->type==OB_LAMP) {
 					Mat4CpyMat4(ob->obmat, dob->mat);
 
-					GPU_lamp_from_blender(ob, ob->data);
-					if(ob->gpulamp)
-						shade_one_light(shi, shr, ob->gpulamp);
+					lamp = GPU_lamp_from_blender(ob, base->object);
+					if(lamp)
+						shade_one_light(shi, shr, lamp);
 				}
 			}
 			
@@ -855,7 +863,7 @@
 	GPUMaterial *mat= shi->gpumat;
 	MTex *mtex;
 	Tex *tex;
-	GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil = NULL;
+	GPUNodeLink *texco, *tin, *trgb, *tnor, *tcol, *stencil, *tnorfac;
 	GPUNodeLink *texco_norm, *texco_orco, *texco_object, *texco_tangent;
 	GPUNodeLink *texco_global, *texco_uv = NULL;
 	GPUNodeLink *colfac, *newnor, *varfac, *orn;
@@ -993,10 +1001,17 @@
 						newnor = tnor;
 
 					norfac = MIN2(mtex->norfac, 1.0);
-					if(norfac == 1.0f)
+					if(norfac == 1.0f && !GPU_link_changed(stencil)) {
 						shi->vn = newnor;
-					else
-						GPU_link(mat, "mtex_blend_normal", GPU_uniform(&norfac), shi->vn, newnor, &shi->vn);
+					}
+					else {
+						tnorfac = GPU_uniform(&norfac);
+
+						if(GPU_link_changed(stencil))
+							GPU_link(mat, "math_multiply", tnorfac, stencil, &tnorfac);
+
+						GPU_link(mat, "mtex_blend_normal", tnorfac, shi->vn, newnor, &shi->vn);
+					}
 				}
 
 				GPU_link(mat, "vec_math_negate", shi->vn, &orn);
@@ -1217,31 +1232,40 @@
 
 void GPU_materials_free()
 {
+	Object *ob;
 	Material *ma;
+	extern Material defmaterial;
 
-	for(ma=G.main->mat.first; ma; ma=ma->id.next) {
-		if(ma->gpumaterial) {
-			GPU_material_free(ma->gpumaterial);
-			ma->gpumaterial = NULL;
-		}
-	}
+	for(ma=G.main->mat.first; ma; ma=ma->id.next)
+		GPU_material_free(ma);
+
+	GPU_material_free(&defmaterial);
+
+	for(ob=G.main->object.first; ma; ma=ma->id.next)
+		GPU_lamp_free(ob);
 }
 
 /* Lamps and shadow buffers */
 
 void GPU_lamp_update(GPULamp *lamp, float obmat[][4])
 {
-	VECCOPY(lamp->vec, obmat[2]);
-	VECCOPY(lamp->co, obmat[3]);
-	Mat4CpyMat4(lamp->obmat, obmat);
-	Mat4Invert(lamp->imat, obmat);
+	float mat[4][4];
+
+	Mat4CpyMat4(mat, obmat);
+	Mat4Ortho(mat);
+
+	VECCOPY(lamp->vec, mat[2]);
+	VECCOPY(lamp->co, mat[3]);
+	Mat4CpyMat4(lamp->obmat, mat);
+	Mat4Invert(lamp->imat, mat);
 }
 
-static void gpu_lamp_from_blender(Object *ob, Lamp *la, GPULamp *lamp)
+static void gpu_lamp_from_blender(Object *ob, Object *par, Lamp *la, GPULamp *lamp)
 {
 	float temp, angle, pixsize, wsize;
 
 	lamp->ob = ob;
+	lamp->par = par;
 	lamp->la = la;
 	lamp->lay = ob->lay;
 
@@ -1290,65 +1314,83 @@
 	i_window(-wsize, wsize, -wsize, wsize, lamp->d, lamp->clipend, lamp->winmat);
 }
 
-int GPU_lamp_from_blender(Object *ob, Lamp *la)
+static void gpu_lamp_shadow_free(GPULamp *lamp)
 {
+	if(lamp->tex)
+		GPU_texture_free(lamp->tex);
+	if(lamp->fb)
+		GPU_framebuffer_free(lamp->fb);
+}
+
+GPULamp *GPU_lamp_from_blender(Object *ob, Object *par)
+{
+	Lamp *la;
 	GPULamp *lamp;
+	LinkData *link;
 
-	if(ob->gpulamp) {
-		//gpu_lamp_from_blender(ob, la, ob->gpulamp);
-		return 1;
-	}
+	for(link=ob->gpulamp.first; link; link=link->next)
+		if(((GPULamp*)link->data)->par == par)
+			return link->data;
 
 	lamp = MEM_callocN(sizeof(GPULamp), "GPULamp");
-	ob->gpulamp = lamp;
 
-	gpu_lamp_from_blender(ob, la, lamp);
+	link = MEM_callocN(sizeof(LinkData), "GPULampLink");
+	link->data = lamp;
+	BLI_addtail(&ob->gpulamp, link);
 
+	la = ob->data;
+	gpu_lamp_from_blender(ob, par, la, lamp);
+
 	if(la->type==LA_SPOT && (la->mode & LA_SHAD_BUF)) {
 		/* opengl */
 		lamp->fb = GPU_framebuffer_create();
 		if(!lamp->fb) {
-			GPU_lamp_free(lamp);
-			return 0;
+			gpu_lamp_shadow_free(lamp);
+			return lamp;
 		}
 
 		lamp->tex = GPU_texture_create_depth(lamp->size, lamp->size);
 		if(!lamp->tex) {
-			GPU_lamp_free(lamp);
-			return 0;
+			gpu_lamp_shadow_free(lamp);
+			return lamp;
 		}
 
 		if(!GPU_framebuffer_texture_attach(lamp->fb, lamp->tex)) {
-			GPU_lamp_free(lamp);
-			return 0;
+			gpu_lamp_shadow_free(lamp);
+			return lamp;
 		}
 
 		GPU_framebuffer_restore();
 	}
 
-	return 1;
+	return lamp;
 }
 
-void GPU_lamp_free(GPULamp *lamp)
+void GPU_lamp_free(Object *ob)
 {
+	GPULamp *lamp;
+	LinkData *link;
 	LinkNode *nlink;
 	Material *ma;
 
-	for(nlink=lamp->materials; nlink; nlink=nlink->next) {
-		ma= nlink->link;
-		if(ma->gpumaterial) {
-			GPU_material_free(ma->gpumaterial);
-			ma->gpumaterial= NULL;
+	for(link=ob->gpulamp.first; link; link=link->next) {
+		lamp = link->data;
+
+		for(nlink=lamp->materials; nlink; nlink=nlink->next) {
+			ma= nlink->link;
+			if(ma->gpumaterial) {
+				GPU_material_free(ma);
+				ma->gpumaterial= NULL;
+			}
 		}
+		BLI_linklist_free(lamp->materials, NULL);
+
+		gpu_lamp_shadow_free(lamp);
+
+		MEM_freeN(lamp);
 	}
-	BLI_linklist_free(lamp->materials, NULL);
 
-	if(lamp->tex)
-		GPU_texture_free(lamp->tex);
-	if(lamp->fb)
-		GPU_framebuffer_free(lamp->fb);
-
-	MEM_freeN(lamp);
+	BLI_freelistN(&ob->gpulamp);
 }
 
 int GPU_lamp_has_shadow_buffer(GPULamp *lamp)

Modified: branches/apricot/source/blender/makesdna/DNA_object_types.h

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list