[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3080] trunk/py/scripts/addons/ io_export_after_effects.py: 1. Added export of Blender' s lamps as After Effects lights.

Bartek Skorupa bartekskorupa at bartekskorupa.com
Sat Mar 10 10:12:02 CET 2012


Revision: 3080
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3080
Author:   bartekskorupa
Date:     2012-03-10 09:11:43 +0000 (Sat, 10 Mar 2012)
Log Message:
-----------
1. Added export of Blender's lamps as After Effects lights. Type of Blender's lamp is added to name of After Effects light    2. Added option to export static scene. In this case not necessary to go through each frame and refresh context    3. Added several conditions to prevent from adding unnecessary keyframes in After Effects. Values of properties that don't changed are set once and no keyframes are added

Modified Paths:
--------------
    trunk/py/scripts/addons/io_export_after_effects.py

Modified: trunk/py/scripts/addons/io_export_after_effects.py
===================================================================
--- trunk/py/scripts/addons/io_export_after_effects.py	2012-03-09 21:59:24 UTC (rev 3079)
+++ trunk/py/scripts/addons/io_export_after_effects.py	2012-03-10 09:11:43 UTC (rev 3080)
@@ -22,7 +22,7 @@
     'name': 'Export: Adobe After Effects (.jsx)',
     'description': 'Export cameras, selected objects & camera solution 3D Markers to Adobe After Effects CS3 and above',
     'author': 'Bartek Skorupa',
-    'version': (0, 6, 1),
+    'version': (0, 6, 2),
     'blender': (2, 6, 2),
     'location': 'File > Export > Adobe After Effects (.jsx)',
     "warning": "",
@@ -112,8 +112,7 @@
             solids.append([ob, convert_name(ob.name)])
 
         elif ob.type == 'LAMP':
-            # not ready yet. Lamps will be exported as nulls. This is temporary
-            nulls.append([ob, convert_name(ob.name)])
+            lights.append([ob, ob.data.type + convert_name(ob.name)])  # Type of lamp added to name
 
         else:
             nulls.append([ob, convert_name(ob.name)])
@@ -137,10 +136,13 @@
 # convert names of objects to avoid errors in AE.
 def convert_name(name):
     name = "_" + name
-
+    '''
+    # Digits are not allowed at beginning of AE vars names.
+    # This section is commented, as "_" is added at beginning of names anyway.
+    # Placeholder for this name modification is left so that it's not ignored if needed
     if name[0].isdigit():
         name = "_" + name
-
+    '''
     name = bpy.path.clean_name(name)
     name = name.replace("-", "_")
 
@@ -151,18 +153,17 @@
 # this function will be called for every object for every frame
 def convert_transform_matrix(matrix, width, height, aspect, x_rot_correction=False):
 
-    # get blender location for ob
+    # get blender transform data for ob
     b_loc_x, b_loc_y, b_loc_z = matrix.to_translation()
     b_rot_x, b_rot_y, b_rot_z = matrix.to_euler()
     b_scale_x, b_scale_y, b_scale_z = matrix.to_scale()
 
-    # get blender rotation for ob
-    if x_rot_correction:
-        b_rot_x = b_rot_x / pi * 180.0 - 90.0
-    else:
-        b_rot_x = b_rot_x / pi * 180.0
+    # convert radians to degrees
+    b_rot_x = b_rot_x / pi * 180.0
     b_rot_y = b_rot_y / pi * 180.0
     b_rot_z = b_rot_z / pi * 180.0
+    if x_rot_correction:
+        b_rot_x -= 90.0
 
     # convert to AE Position Rotation and Scale
     # Axes in AE are different. AE's X is blender's X, AE's Y is negative Blender's Z, AE's Z is Blender's Y
@@ -244,16 +245,16 @@
 
 
 # jsx script for AE creation
-def write_jsx_file(file, data, selection, include_active_cam, include_selected_cams, include_selected_objects, include_cam_bundles, include_rotation, include_scale):
+def write_jsx_file(file, data, selection, include_animation, include_active_cam, include_selected_cams, include_selected_objects, include_cam_bundles):
 
     print("\n---------------------------\n- Export to After Effects -\n---------------------------")
-    #store the current frame to restore it at the enf of export
+    # store the current frame to restore it at the end of export
     curframe = data['curframe']
-    #create array which will contain all keyframes values
+    # create array which will contain all keyframes values
     js_data = {
         'times': '',
         'cameras': {},
-        'solids': {},
+        'solids': {},  # not ready yet
         'lights': {},
         'nulls': {},
         'bundles_cam': {},
@@ -271,10 +272,17 @@
         active_cam_name = name_ae  # store name to be used when creating keyframes for active cam.
         js_data['cameras'][name_ae] = {
             'position': '',
-            'pointOfInterest': '',
+            'position_static': '',
+            'position_anim': False,
             'orientation': '',
+            'orientation_static': '',
+            'orientation_anim': False,
             'rotationX': '',
+            'rotationX_static': '',
+            'rotationX_anim': False,
             'zoom': '',
+            'zoom_static': '',
+            'zoom_anim': False,
             }
 
     # create camera structure for selected cameras
@@ -284,10 +292,17 @@
                 name_ae = selection['cameras'][i][1]
                 js_data['cameras'][name_ae] = {
                     'position': '',
-                    'pointOfInterest': '',
+                    'position_static': '',
+                    'position_anim': False,
                     'orientation': '',
+                    'orientation_static': '',
+                    'orientation_anim': False,
                     'rotationX': '',
+                    'rotationX_static': '',
+                    'rotationX_anim': False,
                     'zoom': '',
+                    'zoom_static': '',
+                    'zoom_anim': False,
                     }
     '''
     # create structure for solids. Not ready yet. Temporarily not active
@@ -299,32 +314,59 @@
             'rotationX': '',
             'scale': '',
             }
-
-   # create structure for lights. Not ready yet. Temporarily not active
+    '''
+    # create structure for lights
     for i, obj in enumerate(selection['lights']):
-        name_ae = selection['lights'][i][1]
-        js_data['nulls'][name_ae] = {
-            'position': '',
-            'orientation': '',
-            'rotationX': '',
-            'scale': '',
-            }
-    '''
+        if include_selected_objects:
+            name_ae = selection['lights'][i][1]
+            js_data['lights'][name_ae] = {
+                'type': selection['lights'][i][0].data.type,
+                'energy': '',
+                'energy_static': '',
+                'energy_anim': False,
+                'cone_angle': '',
+                'cone_angle_static': '',
+                'cone_angle_anim': False,
+                'cone_feather': '',
+                'cone_feather_static': '',
+                'cone_feather_anim': False,
+                'color': '',
+                'color_static': '',
+                'color_anim': False,
+                'position': '',
+                'position_static': '',
+                'position_anim': False,
+                'orientation': '',
+                'orientation_static': '',
+                'orientation_anim': False,
+                'rotationX': '',
+                'rotationX_static': '',
+                'rotationX_anim': False,
+                }
 
+
     # create structure for nulls
     for i, obj in enumerate(selection['nulls']):  # nulls representing blender's obs except cameras, lamps and solids
         if include_selected_objects:
             name_ae = selection['nulls'][i][1]
             js_data['nulls'][name_ae] = {
                 'position': '',
+                'position_static': '',
+                'position_anim': False,
                 'orientation': '',
+                'orientation_static': '',
+                'orientation_anim': False,
                 'rotationX': '',
+                'rotationX_static': '',
+                'rotationX_anim': False,
                 'scale': '',
+                'scale_static': '',
+                'scale_anim': False,
                 }
 
     # create structure for cam bundles including positions (cam bundles don't move)
     if include_cam_bundles:
-        # go through each selected Camera and active cameras
+        # go through each selected camera and active cameras
         selected_cams = []
         active_cams = []
         if include_active_cam:
@@ -340,7 +382,7 @@
             for constraint in cam.constraints:
                 # does the camera have a Camera Solver constraint
                 if constraint.type == 'CAMERA_SOLVER':
-                    # Which movie clip does it use ?
+                    # Which movie clip does it use
                     if constraint.use_active_clip:
                         clip = data['scn'].active_clip
                     else:
@@ -362,7 +404,11 @@
                             js_data['bundles_cam'][name_ae]['position'] += '[%f,%f,%f],' % (ae_transform[0], ae_transform[1], ae_transform[2])
 
     # get all keyframes for each object and store in dico
-    for frame in range(data['start'], data['end'] + 1):
+    if include_animation:
+        end = data['end'] + 1
+    else:
+        end = data['start'] + 1
+    for frame in range(data['start'], end):
         print("working on frame: " + str(frame))
         data['scn'].frame_set(frame)
 
@@ -383,11 +429,29 @@
             # convert Blender's lens to AE's zoom in pixels
             zoom = convert_lens(active_cam, data['width'], data['height'], data['aspect'])
             # store all values in dico
-            js_data['cameras'][name_ae]['position'] += '[%f,%f,%f],' % (ae_transform[0], ae_transform[1], ae_transform[2])
-            js_data['cameras'][name_ae]['pointOfInterest'] += '[%f,%f,%f],' % (ae_transform[0], ae_transform[1], ae_transform[2])
-            js_data['cameras'][name_ae]['orientation'] += '[%f,%f,%f],' % (0, ae_transform[4], ae_transform[5])
-            js_data['cameras'][name_ae]['rotationX'] += '%f ,' % (ae_transform[3])
-            js_data['cameras'][name_ae]['zoom'] += '[%f],' % (zoom)
+            position = '[%f,%f,%f],' % (ae_transform[0], ae_transform[1], ae_transform[2])
+            orientation = '[%f,%f,%f],' % (0, ae_transform[4], ae_transform[5])
+            rotationX = '%f ,' % (ae_transform[3])
+            zoom = '%f,' % (zoom)
+            js_data['cameras'][name_ae]['position'] += position
+            js_data['cameras'][name_ae]['orientation'] += orientation
+            js_data['cameras'][name_ae]['rotationX'] += rotationX
+            js_data['cameras'][name_ae]['zoom'] += zoom
+            # Check if properties change values compared to previous frame
+            # If property don't change through out the whole animation - keyframes won't be added
+            if frame != data['start']:
+                if position != js_data['cameras'][name_ae]['position_static']:
+                    js_data['cameras'][name_ae]['position_anim'] = True
+                if orientation != js_data['cameras'][name_ae]['orientation_static']:
+                    js_data['cameras'][name_ae]['orientation_anim'] = True
+                if rotationX != js_data['cameras'][name_ae]['rotationX_static']:
+                    js_data['cameras'][name_ae]['rotationX_anim'] = True

@@ Diff output truncated at 10240 characters. @@


More information about the Bf-extensions-cvs mailing list