[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [562] trunk/py/scripts/addons: * Added "Fracture" script by pildanovak (vilda) for 2.5
Martin Buerbaum
martin.buerbaum at gmx.at
Tue Apr 13 14:01:21 CEST 2010
Revision: 562
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-extensions&revision=562
Author: pontiac
Date: 2010-04-13 14:01:21 +0200 (Tue, 13 Apr 2010)
Log Message:
-----------
* Added "Fracture" script by pildanovak (vilda) for 2.5
* https://projects.blender.org/tracker/index.php?func=detail&aid=21793&group_id=153&atid=467
* TODO: Better file/dir name(s)?
* TODO: Cleanup UI a bit.
Added Paths:
-----------
trunk/py/scripts/addons/fracture/
trunk/py/scripts/addons/fracture/__init__.py
trunk/py/scripts/addons/fracture/data.blend
trunk/py/scripts/addons/fracture/fracture_ops.py
trunk/py/scripts/addons/fracture/fracture_setup.py
Added: trunk/py/scripts/addons/fracture/__init__.py
===================================================================
--- trunk/py/scripts/addons/fracture/__init__.py (rev 0)
+++ trunk/py/scripts/addons/fracture/__init__.py 2010-04-13 12:01:21 UTC (rev 562)
@@ -0,0 +1,52 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+bl_addon_info = {
+ 'name': 'Object: Fracture tools',
+ 'author': 'pildanovak',
+ 'version': '2.0',
+ 'blender': (2, 5, 3),
+ 'location': 'Fracture tools (Search > Fracture Object,' \
+ ' Add Bomb, Rigidbody Recorder)',
+ 'url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/Scripts/',
+ 'category': 'Object'}
+
+import bpy
+
+
+def register():
+ from fracture import fracture_ops, fracture_setup
+ bpy.types.register(fracture_ops.FractureSimple)
+ bpy.types.register(fracture_ops.FractureGroup)
+ bpy.types.register(fracture_ops.ImportRecorder)
+ bpy.types.register(fracture_ops.ImportBomb)
+ bpy.types.register(fracture_ops.ImportProjectile)
+ bpy.types.register(fracture_setup.SetupShards)
+
+
+def unregister():
+ from fracture import fracture_ops, fracture_setup
+ bpy.types.unregister(fracture_ops.FractureSimple)
+ bpy.types.unregister(fracture_ops.FractureGroup)
+ bpy.types.unregister(fracture_ops.ImportRecorder)
+ bpy.types.unregister(fracture_ops.ImportBomb)
+ bpy.types.unregister(fracture_ops.ImportProjectile)
+ bpy.types.unregister(fracture_setup.SetupShards)
+
+if __name__ == "__main__":
+ register()
Added: trunk/py/scripts/addons/fracture/data.blend
===================================================================
(Binary files differ)
Property changes on: trunk/py/scripts/addons/fracture/data.blend
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/py/scripts/addons/fracture/fracture_ops.py
===================================================================
--- trunk/py/scripts/addons/fracture/fracture_ops.py (rev 0)
+++ trunk/py/scripts/addons/fracture/fracture_ops.py 2010-04-13 12:01:21 UTC (rev 562)
@@ -0,0 +1,484 @@
+# ##### BEGIN GPL LICENSE BLOCK #####
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software Foundation,
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+#
+# ##### END GPL LICENSE BLOCK #####
+
+import bpy
+from bpy.props import *
+import os
+import random
+import mathutils
+from mathutils import *
+
+
+def create_cutter(context, crack_type, scale, roughness):
+ ncuts = 12
+ if crack_type == 'FLAT' or crack_type == 'FLAT_ROUGH':
+ bpy.ops.mesh.primitive_cube_add(
+ view_align=False,
+ enter_editmode=False,
+ location=(0, 0, 0),
+ rotation=(0, 0, 0),
+ layer=(True, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False))
+
+ for v in context.scene.objects.active.data.verts:
+ v.co[0] += 1
+ v.co[0] *= scale
+ v.co[1] *= scale
+ v.co[2] *= scale
+ bpy.ops.object.editmode_toggle()
+ bpy.ops.mesh.faces_shade_smooth()
+ bpy.ops.uv.reset()
+
+ if crack_type == 'FLAT_ROUGH':
+ bpy.ops.mesh.subdivide(
+ number_cuts=ncuts,
+ fractal=roughness * 7 * scale,
+ smoothness=0)
+
+ bpy.ops.mesh.vertices_smooth(repeat=5)
+
+ bpy.ops.object.editmode_toggle()
+
+ if crack_type == 'SPHERE' or crack_type == 'SPHERE_ROUGH':
+ bpy.ops.mesh.primitive_ico_sphere_add(subdivisions=4,
+ size=1,
+ view_align=False,
+ enter_editmode=False,
+ location=(0, 0, 0),
+ rotation=(0, 0, 0),
+ layer=(True, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False,
+ False, False, False, False))
+
+ bpy.ops.object.editmode_toggle()
+ bpy.ops.mesh.faces_shade_smooth()
+ bpy.ops.uv.smart_project(angle_limit=66, island_margin=0)
+
+ bpy.ops.object.editmode_toggle()
+ for v in context.scene.objects.active.data.verts:
+ v.co[0] += 1
+ v.co[0] *= scale
+ v.co[1] *= scale
+ v.co[2] *= scale
+
+ if crack_type == 'SPHERE_ROUGH':
+ for v in context.scene.objects.active.data.verts:
+ v.co[0] += roughness * scale * 0.2 * (random.random() - 0.5)
+ v.co[1] += roughness * scale * 0.1 * (random.random() - 0.5)
+ v.co[2] += roughness * scale * 0.1 * (random.random() - 0.5)
+
+ bpy.context.scene.objects.active.selected = True
+ '''
+ # Adding fracture material
+ # @todo Doesn't work at all yet.
+ sce = bpy.context.scene
+ if bpy.data.materials.get('fracture')==None:
+ bpy.ops.material.new()
+ bpy.ops.object.material_slot_add()
+ sce.objects.active.material_slots[0].material.name = 'fracture'
+ else:
+ bpy.ops.object.material_slot_add()
+ sce.objects.active.material_slots[0].material
+ = bpy.data.materials['fracture']
+ '''
+
+
+#UNWRAP
+def getsizefrommesh(ob):
+ bb = ob.bound_box
+ return (
+ bb[5][0] - bb[0][0],
+ bb[3][1] - bb[0][1],
+ bb[1][2] - bb[0][2])
+
+
+def getIslands(shard):
+ sm = shard.data
+ islands = []
+ vgroups = []
+ fgroups = []
+ vgi = []
+ for v in sm.verts:
+ vgi.append(-1)
+
+ gindex = 0
+ for i in range(len(vgi)):
+ if vgi[i] == -1:
+ gproc = [i]
+ vgroups.append([i])
+ fgroups.append([])
+
+ while len(gproc) > 0:
+ i = gproc.pop(0)
+ for f in sm.faces:
+ #if i in f.verts:
+ for v in f.verts:
+ if v == i:
+ for v1 in f.verts:
+ if vgi[v1] == -1:
+ vgi[v1] = gindex
+ vgroups[gindex].append(v1)
+ gproc.append(v1)
+
+ fgroups[gindex].append(f.index)
+
+ gindex += 1
+
+ #print( gindex)
+
+ if gindex == 1:
+ shards = [shard]
+
+ else:
+ shards = []
+ for gi in range(0, gindex):
+ bpy.ops.object.select_all(action='DESELECT')
+ bpy.context.scene.objects.active = shard
+ shard.selected = True
+ bpy.ops.object.duplicate(linked=False, mode=1)
+ a = bpy.context.scene.objects.active
+ sm = a.data
+ print (a.name)
+
+ bpy.ops.object.editmode_toggle()
+ bpy.ops.mesh.select_all(action='DESELECT')
+ bpy.ops.object.editmode_toggle()
+
+ for x in range(len(sm.verts) - 1, -1, -1):
+ if vgi[x] != gi:
+ print('selecting')
+ print (x)
+ a.data.verts[x].selected = True
+
+ print(bpy.context.scene.objects.active.name)
+
+ bpy.ops.object.editmode_toggle()
+ bpy.ops.mesh.delete()
+ bpy.ops.object.editmode_toggle()
+
+ bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
+
+ shards.append(a)
+
+ bpy.context.scene.objects.unlink(shard)
+
+ return shards
+
+
+def boolop(ob, cutter, op):
+ sce = bpy.context.scene
+ fault = 0
+ new_shards = []
+ sizex, sizey, sizez = getsizefrommesh(ob)
+ gsize = sizex + sizey + sizez
+
+ bpy.ops.object.select_all()
+ ob.selected = True
+ sce.objects.active = ob
+ cutter.selected = False
+
+ bpy.ops.object.modifier_add(type='BOOLEAN')
+ a = sce.objects.active
+ a.modifiers['Boolean'].object = cutter
+ a.modifiers['Boolean'].operation = op
+
+ nmesh = a.create_mesh(sce, apply_modifiers=True, settings='PREVIEW')
+
+ if len(nmesh.verts) > 0:
+ a.modifiers.remove(a.modifiers['Boolean'])
+ bpy.ops.object.duplicate(linked=False, mode=1)
+
+ new_shard = sce.objects.active
+ new_shard.data = nmesh
+ #scene.objects.link(new_shard)
+
+ new_shard.location = a.location
+ bpy.ops.object.origin_set(type='ORIGIN_GEOMETRY')
+
+ sizex, sizey, sizez = getsizefrommesh(new_shard)
+ gsize2 = sizex + sizey + sizez
+
+ if gsize2 > gsize * 1.01: # Size check
+ print (gsize2, gsize, ob.name, cutter.name)
+ fault = 1
+ #print ('boolop: sizeerror')
+
+ elif min(nmesh.edge_face_count) < 2: # Manifold check
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list