pushrbx icon

Untitled

pushrbx | PRO | 06/01/14 12:10:57 AM UTC | 0 ⭐ | 530 👁️ | Never ⏰ | []
Python |

14.58 KB

|

None

|

0 👍

/

0 👎

import bpy
from bpy.props import *
from math import pi
 
 
# Load a font
def load_font(font_path):
    """ Load a new TTF font into Blender, and return the font object """
    # get the original list of fonts (before we add a new one)
    original_fonts = bpy.data.fonts.keys()
    
    # load new font
    bpy.ops.font.open(filepath=font_path)
    
    # get the new list of fonts (after we added a new one)
    for font_name in bpy.data.fonts.keys():
        if font_name not in original_fonts:
            return bpy.data.fonts[font_name]
        
    # no new font was added
    return None
# the stuff
#  
#  name: createDissolveText
#  @param
#  @return
#  
def createDissolveText(title,extrude,bevel_depth,spacemode,textsize,width,font):
    """ Create aned animate the exploding texte """
 
    newText = title
    #create text
    bpy.ops.object.text_add(view_align=False, enter_editmode=False,location=(0, 0, 0), rotation=(0, 0, 0))
    ActiveObjectText = bpy.context.scene.objects.active
 
    newtext = bpy.context.scene.objects.active
    #erasing previous objects
    if bpy.context.scene.objects.active.name != 'Text':
        bpy.ops.object.select_all(action='DESELECT')
        #selecting and erasing Text
        bpy.context.scene.objects.active  = bpy.data.objects['Text']
        bpy.context.scene.objects.active.select = True
        bpy.ops.object.delete(use_global=False)
        bpy.ops.object.select_all(action='DESELECT')
        
        #need to delete other objects
        bpy.ops.object.select_all(action='DESELECT')
        #selecting and erasing Turbulence field
        bpy.context.scene.objects.active  = bpy.data.objects['TurbulenceField']
        bpy.context.scene.objects.active.select = True
        bpy.ops.object.delete(use_global=False)
 
        bpy.ops.object.select_all(action='DESELECT')
        #selecting and erasing Plane
        bpy.context.scene.objects.active  = bpy.data.objects['Plane']
        bpy.context.scene.objects.active.select = True
        bpy.ops.object.delete(use_global=False)
 
        bpy.ops.object.select_all(action='DESELECT')
        #selecting and erasing WindField
        bpy.context.scene.objects.active  = bpy.data.objects['WindField']
        bpy.context.scene.objects.active.select = True
        bpy.ops.object.delete(use_global=False)
 
        #selecting newText
        bpy.context.scene.objects.active  = newtext
        bpy.context.scene.objects.active.select = True
        
    #naming/renaming the text
    bpy.context.scene.objects.active.name = 'Text';
    bpy.context.scene.objects.active = bpy.data.objects['Text']
    
    #placing text in position
    ActiveObjectText.rotation_euler[0]=pi/2 #xaxis
    ActiveObjectText.rotation_euler[1]=0.0  #yaxis
    ActiveObjectText.rotation_euler[2]=0.0  #zaxis
    ActiveObjectText.location[0]=0
    ActiveObjectText.location[1]=0
    ActiveObjectText.location[2]=0 
    #changing text
    ActiveObjectText.data.body = title
    
    #text size 
    ActiveObjectText.data.size = textsize
    ActiveObjectText.data.space_character = width
    ActiveObjectText.data.font = font
    #centering text
    #ActiveObjectText.data.align='CENTER'
    ActiveObjectText.data.align=spacemode
    #extrude text
    ActiveObjectText.data.extrude=extrude #0.04
 
    #bevel text
    ActiveObjectText.data.bevel_depth = bevel_depth #0.005
    ActiveObjectText.data.bevel_resolution = 5
    #adjust text position
    ActiveObjectText.location.z= -ActiveObjectText.dimensions[1]/3
    
    #convert to mesh to apply effect
    bpy.ops.object.convert(target='MESH', keep_original=False)
    
    #affect dissolve material
    ActiveObjectText.data.materials.append(bpy.data.materials['DissolveMaterial'])
    ActiveObjectText = bpy.context.scene.objects.active
    
    #Don't forget to deselect before select!
    bpy.ops.object.select_all(action='DESELECT')
    
    #selecting Text
    bpy.context.scene.objects.active  = ActiveObjectText
    bpy.context.scene.objects.active.select = True
    
    #add remesh modifier to text
    bpy.ops.object.modifier_add(type='REMESH')
    #modifying parameters
    ActiveObjectText.modifiers['Remesh'].octree_depth = 9 #10 best quality but vertices number too high
    ActiveObjectText.modifiers['Remesh'].scale=0.99
    ActiveObjectText.modifiers['Remesh'].mode='SMOOTH'
    ActiveObjectText.modifiers['Remesh'].remove_disconnected_pieces=False
    #apply this mofifier
    bpy.ops.object.modifier_apply(apply_as='DATA', modifier="Remesh")
    
    #Nb quads for particle system be careful of API version
    if bpy.app.version[1] < 62 :
        NbQuads = len(ActiveObjectText.data.faces)
    if bpy.app.version[1] == 62 :
        if bpy.app.version[2] >= 2 :
            NbQuads = len(ActiveObjectText.data.polygons.values()) #API 2.62.2 and up
        else:
            NbQuads = len(ActiveObjectText.data.faces)
    if bpy.app.version[1] > 62 :
            NbQuads = len(ActiveObjectText.data.polygons.values()) #API 2.63 and up
 
    #Add Particle System
    bpy.ops.object.particle_system_add()
    #Particle parameters
    ActiveObjectText.particle_systems['ParticleSystem'].settings.count = NbQuads
    ActiveObjectText.particle_systems['ParticleSystem'].settings.frame_start = 10
    ActiveObjectText.particle_systems['ParticleSystem'].settings.frame_end = 60
    ActiveObjectText.particle_systems['ParticleSystem'].settings.lifetime = 80
    ActiveObjectText.particle_systems['ParticleSystem'].point_cache.frame_step = 1
    ActiveObjectText.particle_systems['ParticleSystem'].settings.normal_factor = 0.0
    #not useful
    ActiveObjectText.particle_systems['ParticleSystem'].settings.use_dynamic_rotation = True
    ActiveObjectText.particle_systems['ParticleSystem'].settings.render_type='NONE'
    ActiveObjectText.particle_systems['ParticleSystem'].settings.draw_method='DOT'
    ActiveObjectText.particle_systems['ParticleSystem'].settings.effector_weights.gravity = 0
    ActiveObjectText.particle_systems['ParticleSystem'].settings.adaptive_subframes = True
    ActiveObjectText.particle_systems['ParticleSystem'].settings.courant_target = 0.2
 
    bpy.ops.object.select_all(action='DESELECT')
 
    #Adding Wind force field on center and rotate it -90 on Y
    bpy.ops.object.effector_add(type='WIND', view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(0, -pi/2, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
    ActiveObjectWindField = bpy.context.scene.objects.active
    ActiveObjectWindField.name = 'WindField'
    #settings
    ActiveObjectWindField.field.strength = 1.0
    ActiveObjectWindField.field.flow = 1.0
    ActiveObjectWindField.field.noise = 0.0
    ActiveObjectWindField.field.seed = 27
    ActiveObjectWindField.field.apply_to_location = True
    ActiveObjectWindField.field.apply_to_rotation = True
    ActiveObjectWindField.field.use_absorption = False
 
    #Adding Turbulence Force Field
    bpy.ops.object.effector_add(type='TURBULENCE', view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(0, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
    ActiveObjectTurbulenceField = bpy.context.scene.objects.active
    ActiveObjectTurbulenceField.name = 'TurbulenceField'
    #settings
    ActiveObjectTurbulenceField.field.strength = 15
    ActiveObjectTurbulenceField.field.size = 0.75
    ActiveObjectTurbulenceField.field.flow = 0.5
    ActiveObjectTurbulenceField.field.seed = 23
    ActiveObjectTurbulenceField.field.apply_to_location = True
    ActiveObjectTurbulenceField.field.apply_to_rotation = True
    ActiveObjectTurbulenceField.field.use_absorption = False
 
 
    #Don't forget to deselect before select!
    bpy.ops.object.select_all(action='DESELECT')
 
    #selecting Text
    bpy.context.scene.objects.active  = ActiveObjectText
    bpy.context.scene.objects.active.select = True
 
    #adding wipe texture to text
 
    sTex = bpy.data.textures.new('Wipe', type = 'BLEND')
    sTex.use_color_ramp = True
 
    TexSlot=ActiveObjectText.particle_systems['ParticleSystem'].settings.texture_slots.add()
    TexSlot.texture = sTex
 
    bpy.ops.object.select_all(action='DESELECT')
 
    #Create plane for controlling action of particle system (based on time)
    #if text is created on the fly 'Wipe' texture does not work! don't know really why!
    # so use of an existing plane, and resize it to the text x dimension
    bpy.ops.mesh.primitive_plane_add(view_align=False, enter_editmode=False, location=(0, 0, 0), rotation=(pi/2, 0, 0), layers=(True, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False, False))
    ActiveObjectPlane = bpy.context.scene.objects.active
    ActiveObjectPlane.name = 'Plane'
    #Change dimensions
    ActiveObjectPlane.dimensions = ((ActiveObjectText.dimensions[0]*1.2),(ActiveObjectText.dimensions[1]*1.2),0)
    #hide plane for render
    ActiveObjectPlane.hide_render = True
    #show as wire in 3D
    ActiveObjectPlane.draw_type = 'WIRE'
 
    bpy.ops.object.select_all(action='DESELECT')
 
    #selecting Text
    bpy.context.scene.objects.active  = ActiveObjectText
    bpy.context.scene.objects.active.select = True
 
    TexSlot.texture_coords = 'OBJECT'
    TexSlot.object = ActiveObjectPlane
    TexSlot.use_map_time = True
 
 
    ActiveObjectText.data.update()
 
    bpy.ops.object.modifier_add(type='EXPLODE')
    bpy.ops.mesh.uv_texture_add() #name UVMap by default
    ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].texture_coords = 'UV'
    ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].uv_layer = 'UVMap'
    ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].use_map_alpha = True
    ActiveObjectText.data.materials['DissolveMaterial'].texture_slots['Texture'].alpha_factor = 1.0
 
    ActiveObjectText.modifiers['Explode'].particle_uv = 'UVMap'
    ActiveObjectText.data.update()
 
 
    #Don't forget to deselect before select!
    bpy.ops.object.select_all(action='DESELECT')
 
    #selecting Text
    bpy.context.scene.objects.active  = ActiveObjectText
    bpy.context.scene.objects.active.select = True
    TexSlot.texture_coords = 'OBJECT'
    TexSlot.object = ActiveObjectPlane
 
    TexSlot.use_map_time = False
    TexSlot.use_map_time = True
 
    ActiveObjectText.data.update()
 
 
# Debug Info:
# ./blender -b test.blend -P demo.py
# -b = background mode
# -P = run a Python script within the context of the project file
 
# Init all of the variables needed by this script.  Because Blender executes
# this script, OpenShot will inject a dictionary of the required parameters
# before this script is executed.
params = {      
            'title' : 'Oh Yeah! OpenShot!',
            'extrude' : 0.05,
            'bevel_depth' : 0.01,
            'spacemode' : 'CENTER',
            'text_size' : 1,
            'width' : 1.0,
            'fontname' : 'Bfont',
            
            'color' : [0.8,0.8,0.8],
            'alpha' : 1.0,
            
            'output_path' : '/tmp/',
            'fps' : 24,
            'quality' : 90,
            'file_format' : 'PNG',
            'color_mode' : 'RGBA',
            'horizon_color' : [0, 0, 0],
            'resolution_x' : 1920,
            'resolution_y' : 1080,
            'resolution_percentage' : 100,
            'start_frame' : 20,
            'end_frame' : 25,
            'animation' : True,
        }
 
 
#BEGIN INJECTING PARAMS
params['specular_color'] = [1.0, 1.0, 1.0]
params['fontname'] = '/home/szenya/.fonts/AugieHU.ttf'
params['specular_intensity'] = 0.5
params['start_frame'] = 1
params['spacemode'] = 'CENTER'
params['title'] = '2014 őszén'
params['file_name'] = '2014autumn_1'
params['diffuse_color'] = [0.8045591138945669, 0.37867625092984036, 0.05637409755197975]
params['end_frame'] = 128
params['extrude'] = 0.05
params['bevel_depth'] = 0.01
params['text_size'] = 1.0
params['width'] = 1.0
params['animation_speed'] = '1'
params['resolution_y'] = 720
params['resolution_x'] = 1280
params['file_format'] = 'PNG'
params['resolution_percentage'] = 100
params['color_mode'] = 'RGBA'
params['output_path'] = '/home/szenya/.openshot/blender/17171cca-e8fe-11e3-b76c-28924a1b2703/2014autumn_1'
params['fps'] = 23
params['quality'] = 100
params['animation'] = True
#END INJECTING PARAMS
 
 
# The remainder of this script will modify the current Blender .blend project
# file, and adjust the settings.  The .blend file is specified in the XML file
# that defines this template in OpenShot.
#----------------------------------------------------------------------------
 
# Modify Text / Curve settings
#print (bpy.data.curves.keys())
 
 
#text_object = bpy.data.curves["txtName1"]
#text_object.extrude = params["extrude"]
#text_object.bevel_depth = params["bevel_depth"]
#text_object.body = params["title"]
#text_object.align = params["spacemode"]
#text_object.size = params["text_size"]
#text_object.space_character = params["width"]
 
# Get font object
font = None
if params["fontname"] != "Bfont":
    # Add font so it's available to Blender
    font = load_font(params["fontname"])
else:
    # Get default font
    font = bpy.data.fonts["Bfont"]
 
createDissolveText(params["title"],params["extrude"],params["bevel_depth"],params["spacemode"],params["text_size"],params["width"], font)
 
# Change the material settings (color, alpha, etc...)
material_object = bpy.data.materials["DissolveMaterial"]
material_object.diffuse_color = params["diffuse_color"]
material_object.specular_color = params["specular_color"]
material_object.specular_intensity = params["specular_intensity"]
#don't modify alpha!!!!!
#material_object.alpha = params["alpha"]
 
 
 
# Set the render options.  It is important that these are set
# to the same values as the current OpenShot project.  These
# params are automatically set by OpenShot
bpy.context.scene.render.filepath = params["output_path"]
bpy.context.scene.render.fps = params["fps"]
#bpy.context.scene.render.quality = params["quality"]
try:
    bpy.context.scene.render.file_format = params["file_format"]
    bpy.context.scene.render.color_mode = params["color_mode"]
except:
    bpy.context.scene.render.image_settings.file_format = params["file_format"]
    bpy.context.scene.render.image_settings.color_mode = params["color_mode"]
bpy.data.worlds[0].horizon_color = params["horizon_color"]
bpy.context.scene.render.resolution_x = params["resolution_x"]
bpy.context.scene.render.resolution_y = params["resolution_y"]
bpy.context.scene.render.resolution_percentage = params["resolution_percentage"]
bpy.context.scene.frame_start = params["start_frame"]
bpy.context.scene.frame_end = params["end_frame"]
 
# Animation Speed (use Blender's time remapping to slow or speed up animation)
animation_speed = int(params["animation_speed"])    # time remapping multiplier
new_length = int(params["end_frame"]) * animation_speed # new length (in frames)
bpy.context.scene.frame_end = new_length
bpy.context.scene.render.frame_map_old = 1
bpy.context.scene.render.frame_map_new = animation_speed
if params["start_frame"] == params["end_frame"]:
    bpy.context.scene.frame_start = params["end_frame"]
    bpy.context.scene.frame_end = params["end_frame"]
 
# Render the current animation to the params["output_path"] folder
bpy.ops.render.render(animation=params["animation"])

Comments