|
Blender
V2.59
|
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 };