Blender  V2.59
MOD_subsurf.c
Go to the documentation of this file.
00001 /*
00002 * $Id: MOD_subsurf.c 36777 2011-05-19 11:54:03Z blendix $
00003 *
00004 * ***** BEGIN GPL LICENSE BLOCK *****
00005 *
00006 * This program is free software; you can redistribute it and/or
00007 * modify it under the terms of the GNU General Public License
00008 * as published by the Free Software Foundation; either version 2
00009 * of the License, or (at your option) any later version.
00010 *
00011 * This program is distributed in the hope that it will be useful,
00012 * but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 * GNU General Public License for more details.
00015 *
00016 * You should have received a copy of the GNU General Public License
00017 * along with this program; if not, write to the Free Software  Foundation,
00018 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
00019 *
00020 * The Original Code is Copyright (C) 2005 by the Blender Foundation.
00021 * All rights reserved.
00022 *
00023 * Contributor(s): Daniel Dunbar
00024 *                 Ton Roosendaal,
00025 *                 Ben Batt,
00026 *                 Brecht Van Lommel,
00027 *                 Campbell Barton
00028 *
00029 * ***** END GPL LICENSE BLOCK *****
00030 *
00031 */
00032 
00038 #include <stddef.h>
00039 
00040 #include "DNA_scene_types.h"
00041 #include "DNA_object_types.h"
00042 
00043 #include "BLI_utildefines.h"
00044 
00045 
00046 #include "BKE_cdderivedmesh.h"
00047 #include "BKE_scene.h"
00048 #include "BKE_subsurf.h"
00049 
00050 #include "MOD_modifiertypes.h"
00051 
00052 #include "CCGSubSurf.h"
00053 
00054 static void initData(ModifierData *md)
00055 {
00056         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00057 
00058         smd->levels = 1;
00059         smd->renderLevels = 2;
00060         smd->flags |= eSubsurfModifierFlag_SubsurfUv;
00061 }
00062 
00063 static void copyData(ModifierData *md, ModifierData *target)
00064 {
00065         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00066         SubsurfModifierData *tsmd = (SubsurfModifierData*) target;
00067 
00068         tsmd->flags = smd->flags;
00069         tsmd->levels = smd->levels;
00070         tsmd->renderLevels = smd->renderLevels;
00071         tsmd->subdivType = smd->subdivType;
00072 }
00073 
00074 static void freeData(ModifierData *md)
00075 {
00076         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00077 
00078         if(smd->mCache) {
00079                 ccgSubSurf_free(smd->mCache);
00080         }
00081         if(smd->emCache) {
00082                 ccgSubSurf_free(smd->emCache);
00083         }
00084 }
00085 
00086 static int isDisabled(ModifierData *md, int useRenderParams)
00087 {
00088         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00089         int levels= (useRenderParams)? smd->renderLevels: smd->levels;
00090 
00091         return get_render_subsurf_level(&md->scene->r, levels) == 0;
00092 }
00093 
00094 static DerivedMesh *applyModifier(ModifierData *md, Object *ob,
00095                                                 DerivedMesh *derivedData,
00096                                                 int useRenderParams,
00097                                                 int isFinalCalc)
00098 {
00099         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00100         DerivedMesh *result;
00101 
00102         result = subsurf_make_derived_from_derived(derivedData, smd,
00103                         useRenderParams, NULL, isFinalCalc, 0, (ob->flag & OB_MODE_EDIT));
00104         
00105         if(useRenderParams || !isFinalCalc) {
00106                 DerivedMesh *cddm= CDDM_copy(result);
00107                 result->release(result);
00108                 result= cddm;
00109         }
00110 
00111         return result;
00112 }
00113 
00114 static DerivedMesh *applyModifierEM(ModifierData *md, Object *UNUSED(ob),
00115                                                 struct EditMesh *UNUSED(editData),
00116                                                 DerivedMesh *derivedData)
00117 {
00118         SubsurfModifierData *smd = (SubsurfModifierData*) md;
00119         DerivedMesh *result;
00120 
00121         result = subsurf_make_derived_from_derived(derivedData, smd, 0,
00122                         NULL, 0, 1, 1);
00123 
00124         return result;
00125 }
00126 
00127 
00128 ModifierTypeInfo modifierType_Subsurf = {
00129         /* name */              "Subsurf",
00130         /* structName */        "SubsurfModifierData",
00131         /* structSize */        sizeof(SubsurfModifierData),
00132         /* type */              eModifierTypeType_Constructive,
00133         /* flags */             eModifierTypeFlag_AcceptsMesh
00134                                                         | eModifierTypeFlag_SupportsMapping
00135                                                         | eModifierTypeFlag_SupportsEditmode
00136                                                         | eModifierTypeFlag_EnableInEditmode
00137                                                         | eModifierTypeFlag_AcceptsCVs,
00138 
00139         /* copyData */          copyData,
00140         /* deformVerts */       NULL,
00141         /* deformMatrices */    NULL,
00142         /* deformVertsEM */     NULL,
00143         /* deformMatricesEM */  NULL,
00144         /* applyModifier */     applyModifier,
00145         /* applyModifierEM */   applyModifierEM,
00146         /* initData */          initData,
00147         /* requiredDataMask */  NULL,
00148         /* freeData */          freeData,
00149         /* isDisabled */        isDisabled,
00150         /* updateDepgraph */    NULL,
00151         /* dependsOnTime */     NULL,
00152         /* dependsOnNormals */  NULL,
00153         /* foreachObjectLink */ NULL,
00154         /* foreachIDLink */     NULL,
00155 };