~openshot.code/openshot/main

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
#	OpenShot Video Editor is a program that creates, modifies, and edits video files.
#   Copyright (C) 2009  Jonathan Thomas
#
#	This file is part of OpenShot Video Editor (http://launchpad.net/openshot/).
#
#	OpenShot Video Editor 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 3 of the License, or
#	(at your option) any later version.
#
#	OpenShot Video Editor 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 OpenShot Video Editor.  If not, see <http://www.gnu.org/licenses/>.


# Import Blender's python API.  This only works when the script is being
# run from the context of Blender.  Blender contains it's own version of Python
# with this library pre-installed.
import bpy
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
def createExplodeTxt(title,particle_number,extrude,bevel_depth,spacemode,textsize,width,font,ground):
	""" 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))
	
	newtext = bpy.context.scene.objects.active

	if bpy.context.scene.objects.active.name != 'Text':
		bpy.ops.object.select_all(action='DESELECT')
		#selecting 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')
		#selecting Text
		bpy.context.scene.objects.active  = newtext
		bpy.context.scene.objects.active.select = True
		
	#naming the text
	bpy.context.scene.objects.active.name = 'Text';
	
	bpy.context.scene.objects.active = bpy.data.objects['Text']
	
	#modifying the text
	bpy.context.scene.objects.active.data.size = textsize
	bpy.context.scene.objects.active.data.space_character = width
	bpy.context.scene.objects.active.data.font = font
	#centering text
	#bpy.data.objects['Text'].data.align='CENTER'
	bpy.data.objects['Text'].data.align=spacemode

	#extrude text
	#bpy.data.objects['Text'].data.extrude=0.1
	bpy.data.objects['Text'].data.extrude=extrude

	#bevel text
	#bpy.data.objects['Text'].data.bevel_depth = 0.01
	bpy.data.objects['Text'].data.bevel_depth = bevel_depth
	bpy.data.objects['Text'].data.bevel_resolution = 10

	#rotating text
	#angles are in radians
	#bpy.ops.transform.rotate(value=(pi/2,), axis=(1.0, 0.0, 0.0), constraint_axis=(False, False, False), constraint_orientation='GLOBAL', mirror=False, proportional='DISABLED', proportional_edit_falloff='SMOOTH', proportional_size=1, snap=False, snap_target='CLOSEST', snap_point=(0, 0, 0), snap_align=False, snap_normal=(0, 0, 0), release_confirm=False)
	#second solution
	bpy.data.objects['Text'].rotation_euler[0]=pi/2 #xaxis
	bpy.data.objects['Text'].rotation_euler[1]=0.0  #yaxis
	bpy.data.objects['Text'].rotation_euler[2]=0.0  #zaxis

	#changing text
	#bpy.data.curves['Text'].body = 'Hello World' #not working
	bpy.context.scene.objects.active=bpy.data.objects['Text']
	bpy.ops.object.editmode_toggle()
	bpy.ops.font.delete()
	bpy.ops.font.text_insert(text=newText, accent=False)
	bpy.ops.object.editmode_toggle()
	
	#convert to mesh to apply effect
	bpy.ops.object.convert(target='MESH', keep_original=False)

	#solidify 
	bpy.ops.object.modifier_add(type='SOLIDIFY')

	#apply quick explode
	bpy.ops.object.quick_explode(style='EXPLODE', amount=100, frame_duration=50, frame_start=1, frame_end=51, velocity=1, fade=True)

	#modifying Particle System
	#emitfrom
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.emit_from = 'VERT'
	#particle number
	#bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.count=200
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.count=particle_number
	#particle lifetime
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.lifetime=200 # 200 +48 > 150 ;-)z
	# start/end explosion
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.frame_end = 48
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.frame_start = 48
	#explosion power
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.normal_factor=5.5
	#integration method
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.integrator='RK4'#aa'MIDPOINT' #'RK4'
	#size of particles
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.particle_size = 0.1
	#particles time step
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.timestep = 0.02
	#mass of particles
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.mass = 2.0
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].settings.use_multiply_size_mass = True
	
	#affect an existing material
	bpy.data.objects['Text'].material_slots[0].material = bpy.data.materials['TextMaterial']
	
	#solidifiy parameter
	bpy.data.objects['Text'].modifiers['Solidify'].edge_crease_inner=0.01
	bpy.data.objects['Text'].modifiers['Solidify'].thickness = 0.02
	#ground management
	bpy.data.objects['Text'].particle_systems['ParticleSystem'].point_cache.frame_step = 1
	if ground=='1':
		bpy.ops.object.select_all(action='DESELECT')
		#selecting Text
		bpy.context.scene.objects.active  = bpy.data.objects['Ground']
		bpy.context.scene.objects.active.select = True
		if bpy.data.objects['Ground'].modifiers.keys()[0] != 'Collision':
			bpy.ops.object.modifier_add(type="COLLISION")
		#else:
		#	print("OK")
		  
		bpy.data.objects['Ground'].hide_render = False
		
	else:
		bpy.ops.object.select_all(action='DESELECT')
		#selecting Text
		bpy.context.scene.objects.active  = bpy.data.objects['Ground']
		bpy.context.scene.objects.active.select = True
		bpy.ops.object.modifier_remove(modifier="Collision")
		bpy.data.objects['Ground'].hide_render = True
	    
	bpy.ops.ptcache.free_bake_all()   # erase baked dynamics
	bpy.ops.ptcache.bake_all() # bake dynamics : take time but needed before rendering animation
	
	
# 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!',
			'particle_number' : 100,
			'ground_on_off' : 1,
			'extrude' : 0.1,
			'bevel_depth' : 0.02,
			'spacemode' : 'CENTER',
			'text_size' : 1.5,
			'width' : 1.0,
			'fontname' : 'Bfont',
			
			'color' : [0.8,0.8,0.8],
			'alpha' : 1.0,
			'alpha_mode' : 'TRANSPARENT',
			
			'output_path' : '/tmp/',
			'fps' : 24,
			'quality' : 90,
			'file_format' : 'PNG',
			'color_mode' : 'RGBA',
			'horizon_color' : [0.57, 0.57, 0.57],
			'resolution_x' : 1920,
			'resolution_y' : 1080,
			'resolution_percentage' : 100,
			'start_frame' : 20,
			'end_frame' : 25,
			'animation' : True,
		}

#INJECT_PARAMS_HERE

# 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"]

# set the font
#text_object.font = font

createExplodeTxt(params["title"],params["particle_number"],params["extrude"],params["bevel_depth"],params["spacemode"],params["text_size"],params["width"], font, params["ground_on_off"])

# Change the material settings (color, alpha, etc...)
material_object = bpy.data.materials["TextMaterial"]
material_object.diffuse_color = params["diffuse_color"]
material_object.specular_color = params["specular_color"]
material_object.specular_intensity = params["specular_intensity"]
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"]
	
# Set background transparency (SKY or TRANSPARENT)
try:
	bpy.context.scene.render.alpha_mode = params["alpha_mode"]
except:
	pass
	
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"])