[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15682] branches/apricot/source: Apricot Branch
Brecht Van Lommel
brechtvanlommel at pandora.be
Tue Jul 22 00:07:55 CEST 2008
Revision: 15682
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15682
Author: blendix
Date: 2008-07-22 00:07:51 +0200 (Tue, 22 Jul 2008)
Log Message:
-----------
Apricot Branch
==============
* Made GLSL respect opaque/add/alpha/clip flags.
* Fix bug for all material types to correctly deal with
different transp flags in a single mesh.
* Also made 3d view material alpha code a bit easier to
understand.
Modified Paths:
--------------
branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
branches/apricot/source/blender/blenkernel/intern/cdderivedmesh.c
branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c
branches/apricot/source/blender/gpu/GPU_draw.h
branches/apricot/source/blender/gpu/GPU_material.h
branches/apricot/source/blender/gpu/intern/gpu_draw.c
branches/apricot/source/blender/gpu/intern/gpu_material.c
branches/apricot/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
branches/apricot/source/gameengine/Converter/BL_BlenderDataConversion.cpp
branches/apricot/source/gameengine/Ketsji/BL_Texture.cpp
branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.cpp
branches/apricot/source/gameengine/Ketsji/KX_BlenderMaterial.h
branches/apricot/source/gameengine/Ketsji/KX_PolygonMaterial.cpp
branches/apricot/source/gameengine/Ketsji/KX_PolygonMaterial.h
branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.cpp
branches/apricot/source/gameengine/Rasterizer/RAS_IPolygonMaterial.h
Modified: branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/blenkernel/intern/DerivedMesh.c 2008-07-21 22:07:51 UTC (rev 15682)
@@ -86,6 +86,7 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -920,11 +921,18 @@
EditFace *efa;
DMVertexAttribs attribs;
GPUVertexAttribs gattribs;
- int i, b, matnr, new_matnr, dodraw;
+ MTFace *tf;
+ int transp, new_transp, orig_transp, tfoffset;
+ int i, b, matnr, new_matnr, dodraw, layer;
dodraw = 0;
matnr = -1;
+ transp = GPU_get_material_blend_mode();
+ orig_transp = transp;
+ layer = CustomData_get_layer_index(&em->fdata, CD_MTFACE);
+ tfoffset = (layer == -1)? -1: em->fdata.layers[layer].offset;
+
memset(&attribs, 0, sizeof(attribs));
/* always use smooth shading even for flat faces, else vertex colors wont interpolate */
@@ -967,6 +975,19 @@
DM_vertex_attributes_from_gpu(dm, &gattribs, &attribs);
}
+ if(tfoffset != -1) {
+ tf = (MTFace*)((char*)efa->data)+tfoffset;
+ new_transp = tf->transp;
+
+ if(new_transp != transp) {
+ if(new_transp == GPU_BLEND_SOLID && orig_transp != GPU_BLEND_SOLID)
+ GPU_set_material_blend_mode(orig_transp);
+ else
+ GPU_set_material_blend_mode(new_transp);
+ transp = new_transp;
+ }
+ }
+
if(dodraw) {
TOTTRI_INC(efa->v4);
Modified: branches/apricot/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/cdderivedmesh.c 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/blenkernel/intern/cdderivedmesh.c 2008-07-21 22:07:51 UTC (rev 15682)
@@ -58,6 +58,7 @@
#include "MEM_guardedalloc.h"
+#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -590,13 +591,17 @@
DMVertexAttribs attribs;
MVert *mvert = cddm->mvert;
MFace *mface = cddm->mface;
+ MTFace *tf = dm->getFaceDataArray(dm, CD_MTFACE);
float (*nors)[3] = dm->getFaceDataArray(dm, CD_NORMAL);
int a, b, dodraw, smoothnormal, matnr, new_matnr;
+ int transp, new_transp, orig_transp;
int orig, *index = dm->getFaceDataArray(dm, CD_ORIGINDEX);
matnr = -1;
smoothnormal = 0;
dodraw = 0;
+ transp = GPU_get_material_blend_mode();
+ orig_transp = transp;
memset(&attribs, 0, sizeof(attribs));
@@ -628,6 +633,22 @@
continue;
}
+ if(tf) {
+ new_transp = tf[a].transp;
+
+ if(new_transp != transp) {
+ glEnd();
+
+ if(new_transp == GPU_BLEND_SOLID && orig_transp != GPU_BLEND_SOLID)
+ GPU_set_material_blend_mode(orig_transp);
+ else
+ GPU_set_material_blend_mode(new_transp);
+ transp = new_transp;
+
+ glBegin(GL_QUADS);
+ }
+ }
+
smoothnormal = (mface->flag & ME_SMOOTH);
if(!smoothnormal) {
Modified: branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/blenkernel/intern/subsurf_ccg.c 2008-07-21 22:07:51 UTC (rev 15682)
@@ -61,6 +61,7 @@
#include "BIF_gl.h"
+#include "GPU_draw.h"
#include "GPU_extensions.h"
#include "GPU_material.h"
@@ -1677,15 +1678,19 @@
CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
GPUVertexAttribs gattribs;
DMVertexAttribs attribs;
+ MTFace *tf = dm->getFaceDataArray(dm, CD_MTFACE);
int gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
int edgeSize = ccgSubSurf_getEdgeSize(ss);
+ int transp, orig_transp, new_transp;
char *faceFlags = DM_get_face_data_layer(dm, CD_FLAGS);
int a, b, i, doDraw, numVerts, matnr, new_matnr, totface;
doDraw = 0;
numVerts = 0;
matnr = -1;
+ transp = GPU_get_material_blend_mode();
+ orig_transp = transp;
memset(&attribs, 0, sizeof(attribs));
@@ -1738,6 +1743,18 @@
continue;
}
+ if(tf) {
+ new_transp = tf[i].transp;
+
+ if(new_transp != transp) {
+ if(new_transp == GPU_BLEND_SOLID && orig_transp != GPU_BLEND_SOLID)
+ GPU_set_material_blend_mode(orig_transp);
+ else
+ GPU_set_material_blend_mode(new_transp);
+ transp = new_transp;
+ }
+ }
+
glShadeModel(drawSmooth? GL_SMOOTH: GL_FLAT);
for (S=0; S<numVerts; S++) {
VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
Modified: branches/apricot/source/blender/gpu/GPU_draw.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_draw.h 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/gpu/GPU_draw.h 2008-07-21 22:07:51 UTC (rev 15682)
@@ -42,15 +42,17 @@
struct Scene;
struct Object;
-/* OpenGL drawing functions. These are also shared with
- * the game engine, whereas they were previously duplicated. */
+/* OpenGL drawing functions related to shading. These are also
+ * shared with the game engine, where there were previously
+ * duplicates of some of these functions. */
/* Initialize */
void GPU_state_init(void);
/* Material drawing
- * - first the state is initialized by a particular object and it's materials
+ * - first the state is initialized by a particular object and
+ * it's materials
* - after this, materials can be quickly enabled by their number,
* GPU_enable_material returns 0 if drawing should be skipped
* - after drawing, the material must be disabled again */
@@ -60,25 +62,34 @@
int GPU_enable_material(int nr, void *attribs);
void GPU_disable_material(void);
+void GPU_set_material_blend_mode(int blendmode);
+int GPU_get_material_blend_mode(void);
+
+/* TexFace drawing
+ * - this is mutually exclusive with material drawing, a mesh should
+ * be drawn using one or the other
+ * - passing NULL clears the state again */
+
+int GPU_set_tpage(struct MTFace *tface);
+
/* Lights
- * - returns how many lights were enabled */
+ * - returns how many lights were enabled
+ * - this affects fixed functions materials and texface, not glsl */
int GPU_default_lights(void);
int GPU_scene_object_lights(struct Scene *scene, struct Object *ob,
int lay, float viewmat[][4]);
-/* Text render */
+/* Text render
+ * - based on moving uv coordinates */
void GPU_render_text(struct MTFace *tface, int mode,
const char *textstr, int textlen, unsigned int *col,
float *v1, float *v2, float *v3, float *v4, int glattrib);
-/* TexFace state setting, NULL clears it */
+/* Mipmap settings
+ * - these will free textures on changes */
-int GPU_set_tpage(struct MTFace *tface);
-
-/* Mipmap settings, these free textures on changes */
-
void GPU_set_mipmap(int mipmap);
void GPU_set_linear_mipmap(int linear);
void GPU_paint_set_mipmap(int mipmap);
Modified: branches/apricot/source/blender/gpu/GPU_material.h
===================================================================
--- branches/apricot/source/blender/gpu/GPU_material.h 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/gpu/GPU_material.h 2008-07-21 22:07:51 UTC (rev 15682)
@@ -84,10 +84,10 @@
} GPUBuiltin;
typedef enum GPUBlendMode {
- GPU_BLEND_SOLID,
- GPU_BLEND_ALPHA,
- GPU_BLEND_ADD,
- GPU_BLEND_CLIPALPHA
+ GPU_BLEND_SOLID = 0,
+ GPU_BLEND_ADD = 1,
+ GPU_BLEND_ALPHA = 2,
+ GPU_BLEND_CLIP = 4
} GPUBlendMode;
typedef struct GPUNodeStack {
Modified: branches/apricot/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/apricot/source/blender/gpu/intern/gpu_draw.c 2008-07-21 21:24:37 UTC (rev 15681)
+++ branches/apricot/source/blender/gpu/intern/gpu_draw.c 2008-07-21 22:07:51 UTC (rev 15682)
@@ -274,54 +274,51 @@
glDisable(GL_ALPHA_TEST);
}
-static void gpu_verify_alpha_mode(MTFace *tface)
+static void gpu_set_blend_mode(GPUBlendMode blendmode)
{
- if(GTS.alphamode == tface->transp)
- return;
+ if(blendmode == GPU_BLEND_SOLID) {
+ glDisable(GL_BLEND);
+ glDisable(GL_ALPHA_TEST);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ }
+ else if(blendmode==GPU_BLEND_ADD) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_ONE, GL_ONE);
+ glDisable(GL_ALPHA_TEST);
+ }
+ else if(blendmode==GPU_BLEND_ALPHA) {
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ /* if U.glalphaclip == 1.0, some cards go bonkers...
+ * turn off alpha test in this case */
- /* verify alpha blending modes */
- GTS.alphamode= tface->transp;
-
- if(GTS.alphamode) {
- if(GTS.alphamode==TF_ADD) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_ONE, GL_ONE);
+ /* added after 2.45 to clip alpha */
+ if(U.glalphaclip == 1.0) {
glDisable(GL_ALPHA_TEST);
- /* glBlendEquationEXT(GL_FUNC_ADD_EXT); */
}
- else if(GTS.alphamode==TF_ALPHA) {
- glEnable(GL_BLEND);
- glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
- /* added after 2.45 to clip alpha */
-
- /* if U.glalphaclip == 1.0, some cards go bonkers...
- * turn off alpha test in this case */
- if(U.glalphaclip == 1.0) {
- glDisable(GL_ALPHA_TEST);
- }
- else {
- glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GREATER, U.glalphaclip);
- }
- }
- else if(GTS.alphamode==TF_CLIP) {
- glDisable(GL_BLEND);
+ else {
glEnable(GL_ALPHA_TEST);
- glAlphaFunc(GL_GREATER, 0.5f);
+ glAlphaFunc(GL_GREATER, U.glalphaclip);
}
- /* glBlendEquationEXT(GL_FUNC_ADD_EXT); */
- /* else { */
- /* glBlendFunc(GL_ONE, GL_ONE); */
- /* glBlendEquationEXT(GL_FUNC_REVERSE_SUBTRACT_EXT); */
- /* } */
}
- else {
- glDisable(GL_BLEND);
- glDisable(GL_ALPHA_TEST);
+ else if(blendmode==GPU_BLEND_CLIP) {
+ glDisable(GL_BLEND);
+ glEnable(GL_ALPHA_TEST);
+ glAlphaFunc(GL_GREATER, 0.5f);
}
}
+static void gpu_verify_alpha_mode(MTFace *tface)
+{
+ /* verify alpha blending modes */
+ if(GTS.alphamode == tface->transp)
+ return;
+
+ gpu_set_blend_mode(tface->transp);
+ GTS.alphamode= tface->transp;
+}
+
static void gpu_verify_reflection(Image *ima)
{
if (ima && (ima->flag & IMA_REFLECT)) {
@@ -758,10 +755,11 @@
Object *gob;
Scene *gscene;
- int hasalpha[MAXMATBUF];
+ GPUBlendMode blendmode[MAXMATBUF];
int alphapass;
int lastmatnr, lastretval;
+ GPUBlendMode lastblendmode;
} GMS;
Material *gpu_active_node_material(Material *ma)
@@ -783,12 +781,13 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list