[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [10769] branches/bmesh/source/blender: BMesh Branch
Joseph Eagar
joeedh at gmail.com
Thu May 24 03:08:11 CEST 2007
Revision: 10769
https://svn.blender.org//revision/?rev=10769&view=rev
Author: joeedh
Date: 2007-05-24 03:08:08 +0200 (Thu, 24 May 2007)
Log Message:
-----------
BMesh Branch
=Drawing Updates=
Bmesh editmode now draws solid faces and (non-selectable) vertex points. Object mode now draws correctly. There's still some bugs though, especially in the conversion of vertex normals.
Modified Paths:
--------------
branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
branches/bmesh/source/blender/blenkernel/intern/cdderivedmesh.c
branches/bmesh/source/blender/blenkernel/intern/mesh.c
branches/bmesh/source/blender/blenloader/intern/readfile.c
branches/bmesh/source/blender/src/drawobject.c
branches/bmesh/source/blender/src/editbmesh_interface.c
Modified: branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h
===================================================================
--- branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h 2007-05-23 23:09:57 UTC (rev 10768)
+++ branches/bmesh/source/blender/blenkernel/BKE_DerivedMesh.h 2007-05-24 01:08:08 UTC (rev 10769)
@@ -61,41 +61,34 @@
struct ModifierData;
struct MCol;
struct Material;
+struct MemArena;
/* number of sub-elements each mesh element has (for interpolation) */
#define SUB_ELEMS_VERT 0
#define SUB_ELEMS_EDGE 2
#define SUB_ELEMS_FACE 4
-
-typedef struct bglTriangle {
- struct bglTriangle *next, *prev;
- float uv[3][2];
- float vert_colors[3][3];
- float vert_cos[3][3];
- float vert_nos[3][3];
-} bglTriangle;
-
-typedef struct bglMesh {
- float *gl_array; //is interleaved
- ListBase triangles;
-} bglMesh;
-
-/*ONLY ACCEPTS TRIANGLES!*/
+/*Only accepts triangles!*/
typedef struct bglCacheDrawInterface {
+ /*this must be called first!*/
+ void (*setMaterials)(void *vself, int totmat, struct Material **materials);
void (*beginCache)(void *vself);
- void (*setMaterials)(void *vself, int totmat, struct Material **materials);
- /*if v4 == NULL, then the face is assumed to be a triangle. Will do quads, or triangles,
- but will NOT automatically tesselate ngons!*/
- void (*addFace)(void *vself, float *verts, float *normals, char *cols,
- int mat, int sel, int smooth);
+ void (*addTriangle)(void *vself, float verts[][3], float normals[][3], char cols[][3],
+ char highcols[4], int mat);
- void (*addEdgeWire)(void *vself, float *v1, float *v2, int sel, int seam);
- void (*addVertPoint)(void *vself, float *v, int sel, int seam);
+ void (*addEdgeWire)(void *vself, float v1[3], float v2[3], char c1[3], char c2[3]);
+ void (*addVertPoint)(void *vself, float v[3], char col[3], float size);
void (*endCache)(void *vself);
- void (*drawCache)(void *vself, int drawlevel);
- /* char *colors is an array of per-face colors.*/
+ void (*drawFacesSolid)(void *vself, int usecolors);
+ void (*drawFacesTransp)(void *vself);
+ void (*drawVertPoints)(void *vself, float alpha);
+ void (*drawEdges)(void *vself);
+
+ /*NOTE: does not free the struct pointed to at vself! just direct data*/
+ void (*release)(void *vself);
+
+ /* char *colors is an array of per-triangle colors.*/
void (*drawCacheOverloadColors)(void *vself, char *colors, int drawlevel, int flags);
} bglCacheDrawInterface;
@@ -109,20 +102,58 @@
/*theres always one group per material, that is
entirely triangles.*/
+typedef struct bglTriangle {
+ struct bglTriangle *next, *prev;
+ float uv[3][2];
+ unsigned char colors[3][3];
+ float cos[3][3];
+ float nos[3][3];
+ unsigned char highlightclr[4];
+ int mat;
+} bglTriangle;
+
+typedef struct bglEdgeWire {
+ struct bglEdgeWire *next, *pref;
+ float v1[3], v2[3];
+ char c1[3], c2[3];
+} bglEdgeWire;
+
+typedef struct bglVertPoint {
+ struct bglVertPoint *next, *prev;
+ float co[3];
+ char col[3];
+ float size;
+} bglVertPoint;
+
typedef struct bglCacheFaceGroup {
float *faceverts;
- float *facecolors;
+ char *facecolors;
+ char *highcolors; /*highlight colors for editmode*/
float *facenormals;
-} bglCacheFaceGroup;
+ int tottris;
+} bglCacheFaceGroup;
-typedef struct bglCacheDrawer {
- bglCacheDrawInterface *interface;
- bglCacheFaceGroup facegroups[16];
+#define MAX_FACEGROUP 16 /*actually a copy of the maximum number of materials, which is 16*/
+
+typedef struct bglCacheMesh {
+ bglCacheDrawInterface cinterface;
+
+ /*temporary stuff used until ->endCache() is called:*/
+ ListBase triangles[MAX_FACEGROUP], wires, points;
+ int tottri, totwire, totpoint;
+ struct MemArena *arena;
+ struct MemArena *gl_arena; /*this holds only opengl arrays*/
+
+ struct Material **mats;
+ int totmat, initilized; /*set to 1 by setmaterials and 2 by begincache, then 3 by endcache (e.g. ready to draw).*/
+
+ /*actual opengl array stuff:*/
+ bglCacheFaceGroup facegroups[MAX_FACEGROUP];
float *edgeverts;
- float *edgecols;
+ char *edgecols;
float *pointverts;
- float *pointcols;
-} bglCacheDrawer;
+ char *pointcols;
+} bglCacheMesh;
typedef struct DerivedMesh DerivedMesh;
struct DerivedMesh {
@@ -262,6 +293,10 @@
/* Draw all vertices as bgl points (no options) */
void (*drawVerts)(DerivedMesh *dm);
+ /* Draw edit verts.
+ This will be generalized somewhat obviously. */
+ void (*drawEditVerts)(DerivedMesh *dm, float alpha);
+
/* Draw edges in the UV mesh (if exists) */
void (*drawUVEdges)(DerivedMesh *dm);
@@ -354,6 +389,9 @@
void (*release)(DerivedMesh *dm);
};
+/*create a new cache drawing interface*/
+bglCacheDrawInterface *bglCacheNew(void);
+
/* utility function to initialise a DerivedMesh's function pointers to
* the default implementation (for those functions which have a default)
*/
Modified: branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c
===================================================================
--- branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c 2007-05-23 23:09:57 UTC (rev 10768)
+++ branches/bmesh/source/blender/blenkernel/intern/DerivedMesh.c 2007-05-24 01:08:08 UTC (rev 10769)
@@ -83,6 +83,7 @@
#include "BIF_gl.h"
#include "BIF_glutil.h"
+#include "BIF_resources.h"
#include "multires.h"
@@ -272,6 +273,7 @@
void DM_from_template(DerivedMesh *dm, DerivedMesh *source,
int numVerts, int numEdges, int numFaces, int numLoops, int numPolys)
{
+ printf("DM_from_template called!\n");
CustomData_copy(&source->vertData, &dm->vertData, CD_MASK_DERIVEDMESH,
CD_CALLOC, numVerts);
CustomData_copy(&source->edgeData, &dm->edgeData, CD_MASK_DERIVEDMESH,
@@ -286,6 +288,8 @@
dm->numVertData = numVerts;
dm->numEdgeData = numEdges;
dm->numFaceData = numFaces;
+ dm->numLoopData = numLoops;
+ dm->numPolyData = numPolys;
DM_init_funcs(dm);
@@ -320,9 +324,13 @@
Mesh tmp = *me;
int totvert, totedge, totface, totloop, totpoly;
+ printf("DM_to_mesh called!\n");
+
memset(&tmp.vdata, 0, sizeof(tmp.vdata));
memset(&tmp.edata, 0, sizeof(tmp.edata));
memset(&tmp.fdata, 0, sizeof(tmp.fdata));
+ memset(&tmp.ldata, 0, sizeof(tmp.ldata));
+ memset(&tmp.pdata, 0, sizeof(tmp.pdata));
totvert = tmp.totvert = dm->getNumVerts(dm);
totedge = tmp.totedge = dm->getNumEdges(dm);
@@ -566,6 +574,8 @@
float (*vertexCos)[3];
float (*vertexNos)[3];
float (*faceNos)[3];
+ bglCacheDrawInterface *cdraw;
+ int recalc_cdraw;
} EditBMeshDerivedMesh;
typedef struct {
@@ -577,12 +587,14 @@
float (*faceNos)[3];
} EditMeshDerivedMesh;
+static void emDM_recalcDrawCache(EditBMeshDerivedMesh *emdm);
+
static void emDM_foreachMappedVert(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no_f, short *no_s), void *userData)
{
EditBMeshDerivedMesh *bem = (EditBMeshDerivedMesh*) dm;
BME_Vert *bev;
int i;
- short no[3];
+ //short no[3];
for (bev=bem->bmesh->verts.first, i=0; bev; i++, bev=bev->next) {
if (bem->vertexCos) {
@@ -597,7 +609,7 @@
EditBMeshDerivedMesh *bem = (EditBMeshDerivedMesh*) dm;
BME_Edge *bed;
int i;
- short no[3];
+ //short no[3];
for (bed=bem->bmesh->edges.first, i=0; bed; i++, bed=bed->next) {
if (bem->vertexCos) {
@@ -610,32 +622,111 @@
static void emDM_drawMappedEdges(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void *userData)
{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+ emdm->bmesh = emdm->bmesh;
+}
-}
static void emDM_drawEdges(DerivedMesh *dm, int drawLooseEdges)
{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+ emdm->bmesh = emdm->bmesh;
+}
-}
static void emDM_drawMappedEdgesInterp(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index), void (*setDrawInterpOptions)(void *userData, int index, float t), void *userData)
{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+ emdm->bmesh = emdm->bmesh;
}
static void emDM_drawUVEdges(DerivedMesh *dm)
{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+ emdm->bmesh = emdm->bmesh;
+
}
+static void emDM_drawEditVerts(DerivedMesh *dm, float alpha)
+{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
+ if (emdm->recalc_cdraw) emDM_recalcDrawCache(emdm);
+
+ emdm->cdraw->drawVertPoints(emdm->cdraw, alpha);
+}
+
+static void emDM_recalcDrawCache(EditBMeshDerivedMesh *emdm)
+{
+ BME_Poly *efa;
+ BME_Loop *loop;
+ BME_Vert *eve;
+ float v[3][3], no[3][3];
+ float nor[3], vsize;
+ char high[4], vcol[3], svcol[3];
+
+ BIF_GetThemeColor3ubv(TH_VERTEX, vcol);
+ BIF_GetThemeColor3ubv(TH_VERTEX_SELECT, svcol);
+ vsize = BIF_GetThemeValuef(TH_VERTEX_SIZE);
+
+ /*Eck! remember to write code to set high (which is the transparent highlight color!)*/
+ if (!emdm->cdraw) emdm->cdraw = bglCacheNew();
+
+ printf("in emDM_recalcDrawCache!\n");
+ emdm->cdraw->release(emdm->cdraw); /*resets the entire draw cache*/
+ emdm->cdraw->setMaterials(emdm->cdraw, G.obedit->totcol, G.obedit->mat);
+ emdm->cdraw->beginCache(emdm->cdraw);
+
+ printf("bleh 1\n");
+ for (efa=emdm->bmesh->polys.first; efa; efa=efa->next) {
+ loop = efa->loopbase->next;
+ do {
+ VECCOPY(v[0], loop->v->co);
+ VECCOPY(v[1], loop->next->v->co);
+ VECCOPY(v[2], efa->loopbase->v->co);
+ if (efa->flag & ME_NSMOOTH) {
+ VECCOPY(no[0], loop->v->no);
+ VECCOPY(no[1], loop->next->v->no);
+ VECCOPY(no[2], efa->loopbase->v->no);
+ printf("smooth face!\n");
+ } else {
+ CalcNormFloat(efa->loopbase->v->co, efa->loopbase->next->v->co,
+ efa->loopbase->next->next->v->co, nor);
+ VECCOPY(no[0], nor);
+ VECCOPY(no[1], nor);
+ VECCOPY(no[2], nor);
+ }
+ emdm->cdraw->addTriangle(emdm->cdraw, v, no, NULL, high, efa->mat_nr);
+ loop=loop->next;
+ } while (loop != efa->loopbase->prev);
+ }
+
+ printf("bleh 2\n");
+ for (eve=emdm->bmesh->verts.first; eve; eve=eve->next) {
+ if (eve->flag & SELECT) emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, svcol, vsize);
+ else emdm->cdraw->addVertPoint(emdm->cdraw, eve->co, vcol, vsize);
+ }
+
+ emdm->recalc_cdraw = 0;
+ emdm->cdraw->endCache(emdm->cdraw);
+}
+
static void emDM__calcFaceCent(EditFace *efa, float cent[3], float (*vertexCos)[3])
{
}
static void emDM_foreachMappedFaceCenter(DerivedMesh *dm, void (*func)(void *userData, int index, float *co, float *no), void *userData)
{
+ EditBMeshDerivedMesh *emdm = (EditBMeshDerivedMesh*) dm;
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list