Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-07-17 08:17:33 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-17 08:17:33 +0400
commite6f45278137567e697327ccdab3099d0145117dd (patch)
treed80641360e323b0fd2d60fb4c04106af7439e8af /source/blender/blenkernel
parent80327e675addf423a2db9cb80768c7e327834d04 (diff)
- added DerivedMesh.getMinMax function (calls DO_MINMAX on all vertices)
- static'd boundbox_displist - added getMinMax implementations for all existing DerivedMesh implementations (mesh, editmesh, displistmesh, and ccgsubsurf)
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_DerivedMesh.h4
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/intern/DerivedMesh.c38
-rw-r--r--source/blender/blenkernel/intern/displist.c12
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c47
5 files changed, 93 insertions, 9 deletions
diff --git a/source/blender/blenkernel/BKE_DerivedMesh.h b/source/blender/blenkernel/BKE_DerivedMesh.h
index 756f9051308..7f71e887791 100644
--- a/source/blender/blenkernel/BKE_DerivedMesh.h
+++ b/source/blender/blenkernel/BKE_DerivedMesh.h
@@ -61,9 +61,11 @@ struct DerivedMesh {
void (*getMappedVertCoEM)(DerivedMesh *dm, void *vert, float co_r[3]);
- /* Convert to new DispListMesh, should be free'd by caller */
+ /* Convert to new DispListMesh, should be free'd by caller */
struct DispListMesh* (*convertToDispListMesh)(DerivedMesh *dm);
+ /* Iterate over all vertex points, calling DO_MINMAX with given args */
+ void (*getMinMax)(DerivedMesh *dm, float min_r[3], float max_r[3]);
/* Direct Access Operations */
/* o Can be undefined */
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 05bf911474b..4efb3f1edb7 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -148,7 +148,6 @@ extern void makeDispListCurveTypes(struct Object *ob);
extern void makeDispListMBall(struct Object *ob);
extern void shadeDispList(struct Object *ob);
void freefastshade(void);
-void boundbox_displist(struct Object *ob);
void imagestodisplist(void);
void reshadeall_displist(void);
void filldisplist(struct ListBase *dispbase, struct ListBase *to);
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c
index 62c6fa0f01f..a861b7d4d47 100644
--- a/source/blender/blenkernel/intern/DerivedMesh.c
+++ b/source/blender/blenkernel/intern/DerivedMesh.c
@@ -45,6 +45,7 @@
#include "BLI_blenlib.h"
#include "BLI_editVert.h"
+#include "BKE_utildefines.h"
#include "BKE_DerivedMesh.h"
#include "BKE_displist.h"
#include "BKE_effect.h"
@@ -112,6 +113,19 @@ static float *meshDM__getVertCoP(MeshDerivedMesh *mdm, int index)
}
}
+static void meshDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
+{
+ MeshDerivedMesh *mdm = (MeshDerivedMesh*) dm;
+ Mesh *me = mdm->ob->data;
+ int i;
+
+ for (i=0; i<me->totvert; i++) {
+ MVert *mv = &me->mvert[i];
+
+ DO_MINMAX(mv->co, min_r, max_r);
+ }
+}
+
static void meshDM_getVertCo(DerivedMesh *dm, int index, float co_r[3])
{
float *co = meshDM__getVertCoP((MeshDerivedMesh*) dm, index);
@@ -435,6 +449,8 @@ static DerivedMesh *getMeshDerivedMesh(Object *ob, float *extverts, float *nors)
{
MeshDerivedMesh *mdm = MEM_callocN(sizeof(*mdm), "dm");
+ mdm->dm.getMinMax = meshDM_getMinMax;
+
mdm->dm.convertToDispListMesh = meshDM_convertToDispListMesh;
mdm->dm.getNumVerts = meshDM_getNumVerts;
mdm->dm.getNumFaces = meshDM_getNumFaces;
@@ -564,6 +580,15 @@ static void emDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
}
}
+static void emDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
+{
+ EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
+ EditVert *eve;
+
+ for (eve= emdm->em->verts.first; eve; eve= eve->next) {
+ DO_MINMAX(eve->co, min_r, max_r);
+ }
+}
static int emDM_getNumVerts(DerivedMesh *dm)
{
EditMeshDerivedMesh *emdm= (EditMeshDerivedMesh*) dm;
@@ -581,6 +606,8 @@ static DerivedMesh *getEditMeshDerivedMesh(EditMesh *em)
{
EditMeshDerivedMesh *emdm = MEM_callocN(sizeof(*emdm), "dm");
+ emdm->dm.getMinMax = emDM_getMinMax;
+
emdm->dm.getNumVerts = emDM_getNumVerts;
emdm->dm.getNumFaces = emDM_getNumFaces;
emdm->dm.getMappedVertCoEM = emDM_getMappedVertCoEM;
@@ -845,6 +872,15 @@ static void ssDM_drawFacesTex(DerivedMesh *dm, int (*setDrawParams)(TFace *tf, i
}
}
+static void ssDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3])
+{
+ SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
+ int i;
+
+ for (i=0; i<ssdm->dlm->totvert; i++) {
+ DO_MINMAX(ssdm->dlm->mvert[i].co, min_r, max_r);
+ }
+}
static int ssDM_getNumVerts(DerivedMesh *dm)
{
SSDerivedMesh *ssdm = (SSDerivedMesh*) dm;
@@ -878,6 +914,8 @@ DerivedMesh *derivedmesh_from_displistmesh(DispListMesh *dlm)
{
SSDerivedMesh *ssdm = MEM_callocN(sizeof(*ssdm), "dm");
+ ssdm->dm.getMinMax = ssDM_getMinMax;
+
ssdm->dm.getNumVerts = ssDM_getNumVerts;
ssdm->dm.getNumFaces = ssDM_getNumFaces;
ssdm->dm.convertToDispListMesh = ssDM_convertToDispListMesh;
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index 3cc3a31af3e..16485d91fc9 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -105,6 +105,8 @@ struct _FastLamp {
/***/
+static void boundbox_displist(Object *ob);
+
static FastLamp *fastlamplist= NULL;
static float fviewmat[4][4];
@@ -771,7 +773,7 @@ void shadeDispList(Object *ob)
{
MFace *mface;
MVert *mvert;
- DispList *dl, *dlob, *dldeform;
+ DispList *dl, *dlob;
Material *ma = NULL;
Mesh *me;
Curve *cu;
@@ -790,9 +792,6 @@ void shadeDispList(Object *ob)
Mat3CpyMat4(imat, tmat);
if(ob->transflag & OB_NEG_SCALE) Mat3MulFloat((float *)imat, -1.0);
- /* we extract dl_verts, deform info */
- dldeform= find_displist(&ob->disp, DL_VERTS);
-
dl = find_displist(&ob->disp, DL_VERTCOL);
if (dl) {
BLI_remlink(&ob->disp, dl);
@@ -1179,8 +1178,7 @@ void reshadeall_displist(void)
ob= base->object;
- /* we extract dl_verts, deform info */
- dldeform= find_displist(&ob->disp, DL_VERTS);
+ dldeform= find_displist(&ob->disp, DL_VERTS); // removed after switchover
if(dldeform) BLI_remlink(&ob->disp, dldeform);
/* Metaballs have standard displist at the Object */
@@ -2211,7 +2209,7 @@ void imagestodisplist(void)
allqueue(REDRAWVIEW3D, 0);
}
-void boundbox_displist(Object *ob)
+static void boundbox_displist(Object *ob)
{
BoundBox *bb=0;
float min[3], max[3];
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 92989638f63..ac48ff5acbb 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -41,6 +41,7 @@
#include "DNA_object_types.h"
#include "BKE_bad_level_calls.h"
+#include "BKE_utildefines.h"
#include "BKE_global.h"
#include "BKE_mesh.h"
#include "BKE_subsurf.h"
@@ -570,6 +571,51 @@ typedef struct {
SubSurf *ss;
} CCGDerivedMesh;
+static void ccgDM_getMinMax(DerivedMesh *dm, float min_r[3], float max_r[3]) {
+ CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
+ CCGSubSurf *ss = ccgdm->ss->subSurf;
+ CCGVertIterator *vi = ccgSubSurf_getVertIterator(ss);
+ CCGEdgeIterator *ei = ccgSubSurf_getEdgeIterator(ss);
+ CCGFaceIterator *fi = ccgSubSurf_getFaceIterator(ss);
+ int i, edgeSize = ccgSubSurf_getEdgeSize(ss);
+ int gridSize = ccgSubSurf_getGridSize(ss);
+
+ for (; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
+ CCGVert *v = ccgVertIterator_getCurrent(vi);
+ float *co = ccgSubSurf_getVertData(ss, v);
+
+ DO_MINMAX(co, min_r, max_r);
+ }
+
+ for (; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
+ CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
+ EditEdge *eed = ccgSubSurf_getEdgeEdgeHandle(ss, e);
+ VertData *edgeData = ccgSubSurf_getEdgeDataArray(ss, e);
+
+ for (i=1; i<edgeSize-1; i++)
+ DO_MINMAX(edgeData[i].co, min_r, max_r);
+ }
+
+ for (; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
+ CCGFace *f = ccgFaceIterator_getCurrent(fi);
+ EditFace *efa = ccgSubSurf_getFaceFaceHandle(ss, f);
+ int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(ss, f);
+
+ for (S=0; S<numVerts; S++) {
+ VertData *faceGridData = ccgSubSurf_getFaceGridDataArray(ss, f, S);
+
+ for (x=0; x<gridSize; x++)
+ DO_MINMAX(faceGridData[x].co, min_r, max_r);
+ for (y=0; y<gridSize; y++)
+ for (x=0; x<gridSize; x++)
+ DO_MINMAX(faceGridData[y*gridSize + x].co, min_r, max_r);
+ }
+ }
+
+ ccgFaceIterator_free(fi);
+ ccgEdgeIterator_free(ei);
+ ccgVertIterator_free(vi);
+}
static int ccgDM_getNumVerts(DerivedMesh *dm) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@@ -910,6 +956,7 @@ static void ccgDM_release(DerivedMesh *dm) {
static CCGDerivedMesh *getCCGDerivedMesh(SubSurf *ss) {
CCGDerivedMesh *ccgdm = MEM_mallocN(sizeof(*ccgdm), "dm");
+ ccgdm->dm.getMinMax = ccgDM_getMinMax;
ccgdm->dm.getNumVerts = ccgDM_getNumVerts;
ccgdm->dm.getNumFaces = ccgDM_getNumFaces;
ccgdm->dm.getMappedVertCoEM = ccgDM_getMappedVertCoEM;