[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