diff options
author | Daniel Dunbar <daniel@zuster.org> | 2005-07-23 23:15:08 +0400 |
---|---|---|
committer | Daniel Dunbar <daniel@zuster.org> | 2005-07-23 23:15:08 +0400 |
commit | e331e68b571b0b72de1c4636209d038c4f679631 (patch) | |
tree | d66238bfebcfd7b92d96621d4b4d56803f1c43a0 /source | |
parent | fb651ddb4a47d86312a4afafaa48e1bf4e48447f (diff) |
- added ModifierData flag, is modifier enabled in editmode
- added modifier type flag: should modifier be enabled by default for
active in editmode
- added subsurf "debug incremental" option instead of G.rt==52 (it becomes
a slightly useful feature now for debugging how well a modifier works
with incremental subsurf... maybe important for future python modifier
developers)
- shuffled modifier button layout just to keep people guessing
- switched back to drawing editmesh face centers not through derivedmesh,
I didn't think this one through, forgot that centers were also used for
selection. have to think about what to do about this, should be either
(a) don't draw centers with a cage active (optimal mode) or (b) come up
with api to draw centers through derivedmesh and also handle selection.
- changed recalc_editnormals to also follow the len(no)==0.0 use vertex
co convention
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_modifier.h | 8 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 7 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/modifier.c | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/subsurf_ccg.c | 13 | ||||
-rw-r--r-- | source/blender/include/butspace.h | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_modifier_types.h | 12 | ||||
-rw-r--r-- | source/blender/src/buttons_object.c | 60 | ||||
-rw-r--r-- | source/blender/src/drawobject.c | 14 | ||||
-rw-r--r-- | source/blender/src/editmesh_lib.c | 5 |
9 files changed, 84 insertions, 46 deletions
diff --git a/source/blender/blenkernel/BKE_modifier.h b/source/blender/blenkernel/BKE_modifier.h index e079b2f2e30..e407c04159c 100644 --- a/source/blender/blenkernel/BKE_modifier.h +++ b/source/blender/blenkernel/BKE_modifier.h @@ -59,6 +59,14 @@ typedef enum { eModifierTypeFlag_AcceptsCVs = (1<<1), eModifierTypeFlag_SupportsMapping = (1<<2), eModifierTypeFlag_SupportsEditmode = (1<<3), + + /* For modifiers that support editmode this determines if the + * modifier should be enabled by default in editmode. This should + * only be used by modifiers that are relatively speedy and + * also generally used in editmode, otherwise let the user enable + * it. + */ + eModifierTypeFlag_EnableInEditmode = (1<<4), } ModifierTypeFlag; typedef struct ModifierTypeInfo { diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index 89b6f1458a4..ce3573366ba 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -34,6 +34,8 @@ #include <config.h> #endif +#include "PIL_time.h" + #include "MEM_guardedalloc.h" #include "DNA_effect_types.h" @@ -1234,6 +1236,7 @@ typedef float vec3f[3]; static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedMesh **deform_r, DerivedMesh **final_r, int useRenderParams, int useDeform) { +// double startTime = PIL_check_seconds_timer(); Mesh *me = ob->data; ModifierData *md= ob->modifiers.first; float (*deformedVerts)[3]; @@ -1351,6 +1354,8 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM if (deformedVerts && deformedVerts!=inputVertexCos) { MEM_freeN(deformedVerts); } + +// printf("mesh_calc_modifiers(%p, %p, %p, %p, %d) : %6.3fs\n", ob, inputVertexCos, deform_r, final_r, useRenderParams, PIL_check_seconds_timer()-startTime); } static vec3f *editmesh_getVertexCos(EditMesh *em, int *numVerts_r) @@ -1387,7 +1392,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r) for (; md; md=md->next) { ModifierTypeInfo *mti = modifierType_get_info(md->type); - if (!(md->mode&1)) continue; + if (!(md->mode&eModifierMode_Editmode)) continue; if (mti->isDisabled && mti->isDisabled(md)) continue; if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue; diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c index 1730c339651..27289c2fc4c 100644 --- a/source/blender/blenkernel/intern/modifier.c +++ b/source/blender/blenkernel/intern/modifier.c @@ -754,7 +754,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type) mti = INIT_TYPE(Subsurf); mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode; + mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode; mti->initData = subsurfModifier_initData; mti->freeData = subsurfModifier_freeData; mti->applyModifier = subsurfModifier_applyModifier; @@ -769,7 +769,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type) mti = INIT_TYPE(Mirror); mti->type = eModifierTypeType_Constructive; - mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode; + mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode; mti->initData = mirrorModifier_initData; mti->applyModifier = mirrorModifier_applyModifier; mti->applyModifierEM = mirrorModifier_applyModifierEM; @@ -791,7 +791,10 @@ ModifierData *modifier_new(int type) ModifierData *md = MEM_callocN(mti->structSize, mti->structName); md->type = type; - md->mode = eModifierMode_RealtimeAndRender; + md->mode = eModifierMode_Realtime|eModifierMode_Render; + + if (mti->flags&eModifierTypeFlag_EnableInEditmode) + md->mode |= eModifierMode_Editmode; if (mti->initData) mti->initData(md); diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c index adc2d90bb24..ca2690a5177 100644 --- a/source/blender/blenkernel/intern/subsurf_ccg.c +++ b/source/blender/blenkernel/intern/subsurf_ccg.c @@ -92,6 +92,7 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAgin if (prevSS) { int oldUseAging; + useAging = !!useAging; ccgSubSurf_getUseAgeCounts(prevSS, &oldUseAging, NULL, NULL, NULL); if (oldUseAging!=useAging) { @@ -1291,8 +1292,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh, Mesh DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, SubsurfModifierData *smd, float (*vertCos)[3]) { int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF; - - smd->emCache = _getSubSurf(smd->emCache, smd->levels, G.rt==52, 0, 0, useSimple); + int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr; + + smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, 0, useSimple); ss_sync_from_editmesh(smd->emCache, em, vertCos, useSimple); return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 1, NULL, NULL); @@ -1316,7 +1318,8 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf return derivedmesh_from_displistmesh(ndlm); } else { int useEdgeCreation = !(dlm?dlm->medge:me->medge); - int useIncremental = smd->useIncrementalMesh && !useEdgeCreation; + int useIncremental = (smd->flags&eSubsurfModifierFlag_Incremental) && !useEdgeCreation; + int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr; CCGSubSurf *ss; /* It is quite possible there is a much better place to do this. It @@ -1333,7 +1336,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf } if (useIncremental && isFinalCalc) { - smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, G.rt==52, 0, 0, useSimple); + smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, useAging, 0, 0, useSimple); ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple); @@ -1344,7 +1347,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf smd->mCache = NULL; } - ss = _getSubSurf(NULL, smd->levels, G.rt==52, 1, useEdgeCreation, useSimple); + ss = _getSubSurf(NULL, smd->levels, 0, 1, useEdgeCreation, useSimple); ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple); ndlm = ss_to_displistmesh(ss, 0, me, dlm); diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h index 6d626a5d6a8..238d2ac712a 100644 --- a/source/blender/include/butspace.h +++ b/source/blender/include/butspace.h @@ -603,7 +603,7 @@ enum { #define B_MDFR_BUTS 3600 -#define B_MDFR_INCREMENTAl 3501 +#define B_MDFR_INCREMENTAL 3501 /* *********************** */ diff --git a/source/blender/makesdna/DNA_modifier_types.h b/source/blender/makesdna/DNA_modifier_types.h index 8efad895e47..c4c5227fa73 100644 --- a/source/blender/makesdna/DNA_modifier_types.h +++ b/source/blender/makesdna/DNA_modifier_types.h @@ -22,9 +22,9 @@ typedef enum ModifierType { */ typedef enum ModifierMode { eModifierMode_Disabled = 0, - eModifierMode_OnlyRealtime = 1, - eModifierMode_OnlyRender = 2, - eModifierMode_RealtimeAndRender = 3, + eModifierMode_Realtime = (1<<0), + eModifierMode_Render = (1<<1), + eModifierMode_Editmode = (1<<2), } ModifierMode; typedef struct ModifierData { @@ -33,10 +33,14 @@ typedef struct ModifierData { int type, mode; } ModifierData; +typedef enum { + eSubsurfModifierFlag_Incremental = (1<<0), + eSubsurfModifierFlag_DebugIncr = (1<<1) +} SubsurfModifierFlag; typedef struct SubsurfModifierData { ModifierData modifier; - short subdivType, levels, renderLevels, useIncrementalMesh; + short subdivType, levels, renderLevels, flags; void *emCache, *mCache; } SubsurfModifierData; diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c index e3f9a57ffc2..a73d333a797 100644 --- a/source/blender/src/buttons_object.c +++ b/source/blender/src/buttons_object.c @@ -1665,9 +1665,11 @@ void do_modifier_panels(unsigned short event) md = md->next; switch(event) { - case B_MDFR_INCREMENTAl: - if (md && md->type==eModifierType_Subsurf && ((SubsurfModifierData*)md)->useIncrementalMesh) { - if (ob->type==OB_MESH) { + case B_MDFR_INCREMENTAL: + if (md && md->type==eModifierType_Subsurf) { + SubsurfModifierData *smd = (SubsurfModifierData*) md; + + if ((smd->flags&eSubsurfModifierFlag_Incremental) && ob->type==OB_MESH) { Mesh *me = ob->data; if (!me->medge) { @@ -1805,64 +1807,66 @@ static void object_panel_modifiers(Object *ob) uiBut *but; block= uiNewBlock(&curarea->uiblocks, "modifiers_panel", UI_EMBOSS, UI_HELV, curarea->win); - uiNewPanelTabbed("Constraints", "Object"); if(uiNewPanel(curarea, block, "Modifiers", "Object", 640, 0, 318, 204)==0) return; uiBlockBeginAlign(block); - uiDefBlockBut(block, modifier_add_menu, ob, "Add Modifier", 550,400,124,27, "Append a new modifier"); - but = uiDefBut(block, BUT, B_MAKEDISP, "Delete", 676,400,62,27, 0, 0, 0, 0, 0, "Delete the current modifier"); + uiDefBlockBut(block, modifier_add_menu, ob, "Add Modifier", 740,400,110,19, "Append a new modifier"); + but = uiDefBut(block, BUT, B_MAKEDISP, "Delete", 850,400,70,19, 0, 0, 0, 0, 0, "Delete the current modifier"); uiButSetFunc(but, modifiers_del, ob, NULL); - uiBlockEndAlign(block); if (ob->modifiers.first) { int i, numModifiers = BLI_countlist(&ob->modifiers); ModifierData *md; CLAMP(actModifier, 1, numModifiers); - uiDefButI(block, NUM, B_REDR, "Modifier", 760,400,160,27, &actModifier, 1, numModifiers, 0, 0, "Index of current modifier"); + uiDefButI(block, NUM, B_REDR, "Modifier", 740,380,180,27, &actModifier, 1, numModifiers, 0, 0, "Index of current modifier"); for (i=0, md=ob->modifiers.first; md && i<actModifier-1; i++) md = md->next; if (md) { - static char *modifier_mode_menu ="Modifier Mode%t|Disabled%x0|Only Realtime%x1|Only Render%x2|Realtime & Render%x3"; ModifierTypeInfo *mti = modifierType_get_info(md->type); char str[128]; - but = uiDefBut(block, BUT, B_MAKEDISP, "Move Up", 760, 380, 80, 19, 0, 0, 0, 0, 0, "Move modifier up in stack"); + but = uiDefBut(block, BUT, B_MAKEDISP, "Move Up", 740, 360, 90, 19, 0, 0, 0, 0, 0, "Move modifier up in stack"); uiButSetFunc(but, modifiers_moveUp, ob, md); - but = uiDefBut(block, BUT, B_MAKEDISP, "Move Down", 840, 380, 80, 19, 0, 0, 0, 0, 0, "Move modifier down in stack"); + but = uiDefBut(block, BUT, B_MAKEDISP, "Move Down", 830, 360, 90, 19, 0, 0, 0, 0, 0, "Move modifier down in stack"); uiButSetFunc(but, modifiers_moveDown, ob, md); + uiDefButBitI(block, TOG, eModifierMode_Render, B_NOP, "Render", 740,340,60,19,&md->mode, 0, 0, 1, 0, ""); + uiDefButBitI(block, TOG, eModifierMode_Realtime, B_MAKEDISP, "Realtime", 810,340,60,19,&md->mode, 0, 0, 1, 0, ""); + if (mti->flags&eModifierTypeFlag_SupportsEditmode) { + uiDefButBitI(block, TOG, eModifierMode_Editmode, B_MAKEDISP, "Editmode", 860,340,60,19,&md->mode, 0, 0, 1, 0, ""); + } - sprintf(str, "Modifier: %s", mti->name); - uiDefBut(block, LABEL, 1, str, 550, 360, 150, 20, NULL, 0.0, 0.0, 0, 0, ""); - but = uiDefButI(block, MENU, B_MAKEDISP, modifier_mode_menu, 550, 340, 160,19, &md->mode, 0, 0, 0, 0, "Modifier calculation mode"); uiBlockBeginAlign(block); + sprintf(str, "Modifier: %s", mti->name); + uiDefBut(block, LABEL, 1, str, 550, 400, 150, 20, NULL, 0.0, 0.0, 0, 0, ""); if (md->type==eModifierType_Subsurf) { SubsurfModifierData *smd = (SubsurfModifierData*) md; char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|Simple Subdiv.%x1"; - uiDefButS(block, NUM, B_MAKEDISP, "Levels:", 550, 320, 150,19, &smd->levels, 1, 6, 0, 0, "Number subdivisions to perform"); - uiDefButS(block, NUM, B_MAKEDISP, "Render Levels:", 550, 300, 150,19, &smd->renderLevels, 1, 6, 0, 0, "Number subdivisions to perform when rendering"); - uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu, 550,280,150,19, &smd->subdivType, 0, 0, 0, 0, "Selects type of subdivision algorithm."); - uiDefButS(block, TOG, B_MDFR_INCREMENTAl, "Incremental", 550, 260,150,19,&smd->useIncrementalMesh, 0, 0, 1, 0, "Use incremental calculation, even outside of mesh mode"); + uiDefButS(block, NUM, B_MAKEDISP, "Levels:", 550, 380, 160,19, &smd->levels, 1, 6, 0, 0, "Number subdivisions to perform"); + uiDefButS(block, NUM, B_MAKEDISP, "Render Levels:", 550, 360, 160,19, &smd->renderLevels, 1, 6, 0, 0, "Number subdivisions to perform when rendering"); + uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu, 550,340,160,19, &smd->subdivType, 0, 0, 0, 0, "Selects type of subdivision algorithm."); + uiDefButBitS(block, TOG, eSubsurfModifierFlag_Incremental, B_MDFR_INCREMENTAL, "Incremental", 550, 320,160,19,&smd->flags, 0, 0, 0, 0, "Use incremental calculation, even outside of mesh mode"); + uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MAKEDISP, "Debug Incr.", 550, 300,160,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers"); } else if (md->type==eModifierType_Lattice) { LatticeModifierData *lmd = (LatticeModifierData*) md; - uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:", 550, 320, 120,19, &lmd->object, "Lattice object to deform with"); + uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:", 550, 380, 120,19, &lmd->object, "Lattice object to deform with"); } else if (md->type==eModifierType_Curve) { CurveModifierData *cmd = (CurveModifierData*) md; - uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:", 550, 320, 120,19, &cmd->object, "Curve object to deform with"); + uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:", 550, 380, 120,19, &cmd->object, "Curve object to deform with"); } else if (md->type==eModifierType_Build) { BuildModifierData *bmd = (BuildModifierData*) md; - uiDefButF(block, NUM, B_MAKEDISP, "Start:", 550, 320, 150,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect"); - uiDefButF(block, NUM, B_MAKEDISP, "Length:", 550, 300, 150,19, &bmd->length, 1.0, 9000.0, 100, 0, "Specify the total time the build effect requires"); - uiDefButI(block, TOG, B_MAKEDISP, "Randomize", 550, 280, 150,19, &bmd->randomize, 0, 0, 1, 0, "Randomize the faces or edges during build."); - uiDefButI(block, NUM, B_MAKEDISP, "Seed:", 700, 280, 150,19, &bmd->seed, 1.0, 9000.0, 100, 0, "Specify the seed for random if used."); + uiDefButF(block, NUM, B_MAKEDISP, "Start:", 550, 380, 150,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect"); + uiDefButF(block, NUM, B_MAKEDISP, "Length:", 550, 360, 150,19, &bmd->length, 1.0, 9000.0, 100, 0, "Specify the total time the build effect requires"); + uiDefButI(block, TOG, B_MAKEDISP, "Randomize", 550, 340, 150,19, &bmd->randomize, 0, 0, 1, 0, "Randomize the faces or edges during build."); + uiDefButI(block, NUM, B_MAKEDISP, "Seed:", 550, 320, 150,19, &bmd->seed, 1.0, 9000.0, 100, 0, "Specify the seed for random if used."); } else if (md->type==eModifierType_Mirror) { MirrorModifierData *mmd = (MirrorModifierData*) md; - uiDefButF(block, NUM, B_MAKEDISP, "Tolerance:", 550, 320, 150,19, &mmd->tolerance, 0.0, 1, 0, 0, "Distance from axis within which to share vertices"); - uiDefButI(block, ROW, B_MAKEDISP, "X", 550, 300, 20,19, &mmd->axis, 1, 0, 0, 0, "Specify the axis to mirror about"); - uiDefButI(block, ROW, B_MAKEDISP, "Y", 570, 300, 20,19, &mmd->axis, 1, 1, 0, 0, "Specify the axis to mirror about"); - uiDefButI(block, ROW, B_MAKEDISP, "Z", 590, 300, 20,19, &mmd->axis, 1, 2, 0, 0, "Specify the axis to mirror about"); + uiDefButF(block, NUM, B_MAKEDISP, "Tolerance:", 550, 380, 150,19, &mmd->tolerance, 0.0, 1, 0, 0, "Distance from axis within which to share vertices"); + uiDefButI(block, ROW, B_MAKEDISP, "X", 550, 360, 20,19, &mmd->axis, 1, 0, 0, 0, "Specify the axis to mirror about"); + uiDefButI(block, ROW, B_MAKEDISP, "Y", 570, 360, 20,19, &mmd->axis, 1, 1, 0, 0, "Specify the axis to mirror about"); + uiDefButI(block, ROW, B_MAKEDISP, "Z", 590, 360, 20,19, &mmd->axis, 1, 2, 0, 0, "Specify the axis to mirror about"); } uiBlockEndAlign(block); diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c index bb0fb52fa0f..0e8be4cedcb 100644 --- a/source/blender/src/drawobject.c +++ b/source/blender/src/drawobject.c @@ -1221,8 +1221,16 @@ static int ev_nonhidden__setDrawOptions(void *userData, EditVert *eve) static void draw_dm_face_normals(DerivedMesh *dm) { dm->drawMappedFaceNormalsEM(dm, G.scene->editbutsize, ef_nonhiddenAndFgon__setDrawOptions, 0); } -static void draw_dm_face_centers(DerivedMesh *dm, int sel) { - dm->drawMappedFaceCentersEM(dm, ef_nonhiddenAndFgon__setDrawOptions, (void*) (sel+1)); +static void draw_em_face_centers(EditMesh *em, int sel) { + EditFace *efa; + + bglBegin(GL_POINTS); + for(efa= em->faces.first; efa; efa= efa->next) { + if(efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel) { + bglVertex3fv(efa->cent); + } + } + bglEnd(); } static void draw_dm_vert_normals(DerivedMesh *dm) { @@ -1377,7 +1385,7 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM) if(G.scene->selectmode & SCE_SELECT_FACE) { glPointSize(fsize); glColor4ubv(fcol); - draw_dm_face_centers(cageDM, sel); + draw_em_face_centers(em, sel); } if (pass==0) { diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c index 677aa070788..7776b507533 100644 --- a/source/blender/src/editmesh_lib.c +++ b/source/blender/src/editmesh_lib.c @@ -1370,7 +1370,10 @@ void recalc_editnormals(void) } for(eve= em->verts.first; eve; eve=eve->next) { - Normalise(eve->no); + if (Normalise(eve->no)==0.0) { + VECCOPY(eve->no, eve->co); + Normalise(eve->no); + } } } |