def render_one_movie(parameter_list):
    # parameter_list = [num_images, movie_index, num_process]    

    # settings
    lower_body_flag = False
    first_person_vire_flag = True
    lr_flip_flag = False
    generate_json_flag = True
    
    sensor_prop = {'type' : 'perspective'}
    
    if first_person_vire_flag:
        sensor_prop['fov'] = 120.0
        
        sensor_prop['toWorld'] = Transform.lookAt(
            Point(0, 15+9, 3.5),   # Camera origin
            Point(0, 9+9, 28.5),     # Camera target
            Vector(0, 1, 0)     # 'up' vector
        )
    else:
        sensor_prop['toWorld'] = Transform.lookAt(
            Point(0, 0, 95),   # Camera origin
            Point(0, 0, 0),     # Camera target
            Vector(0, 1, 0)     # 'up' vector
        )
    
    sensor_prop['film'] = {
        'type' : 'ldrfilm',
        'width' : 64,
        'height' : 64,
        'banner' : False
    }
    
    sensor_prop['sample'] = {
        'type' : 'ldsampler',
        'sampleCount' : 16
    }
    
    
    integrator_prop = {
        'type' : 'path'
    }
    
    
    emitter_prop = {'type' : 'directional'}
    emitter_prop['irradiance'] = Spectrum(50)
    
    if first_person_vire_flag:
        emitter_prop['direction'] = Vector(0, -1, 0)
    else:
        emitter_prop['direction'] = Vector(0, 0, -1)
    
    scheduler = Scheduler.getInstance()
    
    # Start up the scheduling system with one worker per local core
    for i in range(0, multiprocessing.cpu_count() / parameter_list[2]):
        scheduler.registerWorker(LocalWorker(i, 'wrk%i' % i))
    scheduler.start()
    
    # create a queue for tracking render jobs
    queue = RenderQueue()
    
    body = Body(Point(0, 9, 0), lower_body_flag)
    
    shoulder_limits = {
            'p': [-180, 25],
            'y': [-90, 30],
            'r': [-180 , 180]
    }
    
    elbow_limits = [0, 135]
    
    hip_limits = {
            'p': [-125, 15],
            'y': [-90, 60],
            'r': [-30, 70]
    }
    
    knee_limits = [0, 150]
    
    left_shoulder_angles = {
            'p': -85,
            'y': -30,
            'r': 0
    }
    
    right_shoulder_angles = {
            'p': -85,
            'y': -30,
            'r': 0 
    }
    
    left_elbow_angle = 70
    
    right_elbow_angle = 70
    
    prev_left_shoulder_angles = {}
    
    prev_right_shoulder_angles = {}
    
    prev_left_elbow_angle = 0
    
    prev_right_elbow_angle = 0
    
    body.left_arm.set_joint_angles(left_shoulder_angles['p'], left_shoulder_angles['y'], left_shoulder_angles['r'], left_elbow_angle)
    body.right_arm.set_joint_angles(right_shoulder_angles['p'], right_shoulder_angles['y'], right_shoulder_angles['r'], right_elbow_angle)
    
    if lower_body_flag:
        left_hip_angles = {
                'p': -55,
                'y': -15,
                'r': 20 
        }
        
        right_hip_angles = {
                'p': -55,
                'y': -15,
                'r': 20
        }
        
        left_knee_angle = 75
        
        right_knee_angle = 75
        
        prev_left_hip_angles = {}
        
        prev_right_hip_angles = {}
        
        prev_left_knee_angle = 0
        
        prev_right_knee_angle = 0
        
        body.left_leg.set_joint_angles(left_hip_angles['p'], left_hip_angles['y'], left_hip_angles['r'], left_knee_angle)
        body.right_leg.set_joint_angles(right_hip_angles['p'], right_hip_angles['y'], right_hip_angles['r'], right_knee_angle)
        
    index = 0
    
    target_list = ['mit_body_v2_%03i_%05i' % (parameter_list[1], i+1) + '.png' for i in xrange(parameter_list[0])]
    if not generate_json_flag:
        json_list = ['mit_body_v2_%03i_%05i' % (parameter_list[1], i+1)+ '.json' for i in xrange(parameter_list[0])]
    
    if generate_json_flag:
        # Normal run (generating json & png images)
        while (index < parameter_list[0]):
            destination = 'mit_body_v2_%03i_%05i' % (parameter_list[1], index+1)
            scene = Scene()
            pmgr = PluginManager.getInstance()
            # Create a sensor, film & sample generator
            scene.addChild(pmgr.create(sensor_prop))
            # Set the integrator
            scene.addChild(pmgr.create(integrator_prop))
            # Add a light source
            scene.addChild(pmgr.create(emitter_prop))
        
            prev_left_shoulder_angles = left_shoulder_angles
            prev_right_shoulder_angles = right_shoulder_angles
            prev_left_elbow_angle = left_elbow_angle
            prev_right_elbow_angle = right_elbow_angle
        
            if lower_body_flag:
                prev_left_hip_angles = left_hip_angles
                prev_right_hip_angles = right_hip_angles
                prev_left_knee_angle = left_knee_angle
                prev_right_knee_angle = right_knee_angle
        
            temp1 = left_shoulder_angles['p'] + randint(-1, 2)
            if ((temp1 < shoulder_limits['p'][0]) or (temp1 > shoulder_limits['p'][1])):
                continue
        
            temp2 = left_shoulder_angles['y'] + randint(-1, 2)
            if ((temp2 < shoulder_limits['y'][0]) or (temp2 > shoulder_limits['y'][1])):
                continue
        
            temp3 = left_shoulder_angles['r'] + randint(-1, 2)
            if ((temp3 < shoulder_limits['r'][0]) or (temp3 > shoulder_limits['r'][1])):
                continue
        
            temp4 = right_shoulder_angles['p'] + randint(-1, 2)
            if ((temp4 < shoulder_limits['p'][0]) or (temp4 > shoulder_limits['p'][1])):
                continue
        
            temp5 = right_shoulder_angles['y'] + randint(-1, 2)
            if ((temp5 < shoulder_limits['y'][0]) or (temp5 > shoulder_limits['y'][1])):
                continue
        
            temp6 = right_shoulder_angles['r'] + randint(-1, 2)
            if ((temp6 < shoulder_limits['r'][0]) or (temp6 > shoulder_limits['r'][1])):
                continue
                    
            temp7 = left_elbow_angle + randint(-1, 2)
            if ((temp7 < elbow_limits[0]) or (temp7 > elbow_limits[1])):
                continue
        
            temp8 = right_elbow_angle + randint(-1, 2)
            if ((temp8 < elbow_limits[0]) or (temp8 > elbow_limits[1])):
                continue
            
            if lower_body_flag:
                temp9 = left_hip_angles['p'] + randint(-1, 2)
                if ((temp9 < hip_limits['p'][0]) or (temp9 > hip_limits['p'][1])):
                    continue
        
                temp10 = left_hip_angles['y'] + randint(-1, 2)
                if ((temp10 < hip_limits['y'][0]) or (temp10 > hip_limits['y'][1])):
                    continue
        
                temp11 = left_hip_angles['r'] + randint(-1, 2)
                if ((temp11 < hip_limits['r'][0]) or (temp11 > hip_limits['r'][1])): 
                    continue
        
                temp12 = right_hip_angles['p'] + randint(-1, 2)
                if ((temp12 < hip_limits['p'][0]) or (temp12 > hip_limits['p'][1])):
                    continue
        
                temp13 = right_hip_angles['y'] + randint(-1, 2)
                if ((temp13 < hip_limits['y'][0]) or (temp13 > hip_limits['y'][1])):
                    continue
        
                temp14 = right_hip_angles['r'] + randint(-1, 2)
                if ((temp14 < hip_limits['r'][0]) or (temp14 > hip_limits['r'][1])):
                    continue
                
                temp15 = left_knee_angle + randint(-1, 2)
                if ((temp15 < knee_limits[0]) or (temp15 > knee_limits[1])):
                    continue
        
                temp16 = right_knee_angle + randint(-1, 2)
                if ((temp16 < knee_limits[0]) or (temp16 > knee_limits[1])):
                    continue
        
            left_shoulder_angles = dict(zip(['p', 'y', 'r'], [temp1, temp2, temp3]))
            right_shoulder_angles = dict(zip(['p', 'y', 'r'], [temp4, temp5, temp6]))
            left_elbow_angle = temp7
            right_elbow_angle = temp8
            
            if lower_body_flag:
                left_hip_angles = dict(zip(['p', 'y', 'r'], [temp9, temp10, temp11]))
                right_hip_angles = dict(zip(['p', 'y', 'r'], [temp12, temp13, temp14]))
                left_knee_angle = temp15
                right_knee_angle = temp16
            
            body.left_arm.set_joint_angles(left_shoulder_angles['p'], left_shoulder_angles['y'], left_shoulder_angles['r'], left_elbow_angle)
            body.right_arm.set_joint_angles(right_shoulder_angles['p'], right_shoulder_angles['y'], right_shoulder_angles['r'], right_elbow_angle)
        
            if lower_body_flag:
                body.left_leg.set_joint_angles(left_hip_angles['p'], left_hip_angles['y'], left_hip_angles['r'], left_knee_angle)
                body.right_leg.set_joint_angles(right_hip_angles['p'], right_hip_angles['y'], right_hip_angles['r'], right_knee_angle)
        
            cur_left_elbow = body.left_arm.calc_elbow_point()
            cur_right_elbow = body.right_arm.calc_elbow_point()
            cur_left_hand = body.left_arm.calc_hand_point()
            cur_left_hand = body.right_arm.calc_hand_point()
        
            departure_flag = (cur_left_elbow.z < 0) or (cur_right_elbow.z < 0) or (cur_left_hand.z < 0) or (cur_left_hand.z < 0)
        
            if ((body.is_collision_body_parts() == False) and (departure_flag == False)):
                print '\033[94mcollision detection passed!\033[0m'
                # Add body parts
                for prop in body.get_property_list():
                    scene.addChild(pmgr.create(prop))
        
                json_data = body.constr_json_data()
                        
                with open('mit_body_v2_%05i.json' % (index + 1), 'w') as f:
                    json.dump(json_data, f, indent=2)
                
                scene.configure()
                scene.setDestinationFile(destination)
        
                # Create a render job and insert it into the queue
                job = RenderJob('myRenderJob' + str(index), scene, queue)
        
                while True:
                    # Check current number of thread
                    num_thread = queue.getJobCount()
                    if num_thread > 1000:
                        time.sleep(1)
                    else:
                        break
        
                job.start()
                # Increment index
                index += 1
            else:
                body.left_arm.set_joint_angles(prev_left_shoulder_angles['p'], prev_left_shoulder_angles['y'], prev_left_shoulder_angles['r'], prev_left_elbow_angle)
                body.right_arm.set_joint_angles(prev_right_shoulder_angles['p'], prev_right_shoulder_angles['y'], prev_right_shoulder_angles['r'], prev_right_elbow_angle)
                left_shoulder_angles['p'] = prev_left_shoulder_angles['p']
                left_shoulder_angles['y'] = prev_left_shoulder_angles['y']
                left_shoulder_angles['r'] = prev_left_shoulder_angles['r']
                right_shoulder_angles['p'] = prev_right_shoulder_angles['p']
                right_shoulder_angles['y'] = prev_right_shoulder_angles['y']
                right_shoulder_angles['r'] = prev_right_shoulder_angles['r']
                left_elbow_angle = prev_left_elbow_angle
                right_elbow_angle = prev_right_elbow_angle
        
                if lower_body_flag:
                    body.left_leg.set_joint_angles(prev_left_hip_angles['p'], prev_left_hip_angles['y'], prev_left_hip_angles['r'], prev_left_knee_angle)
                    body.right_leg.set_joint_angles(prev_right_hip_angles['p'], prev_right_hip_angles['y'], prev_right_hip_angles['r'], prev_right_knee_angle)
                    left_hip_angles['p'] = prev_left_hip_angles['p']
                    left_hip_angles['y'] = prev_left_hip_angles['y']
                    left_hip_angles['r'] = prev_left_hip_angles['r']
                    right_hip_angles['p'] = prev_right_hip_angles['p']
                    right_hip_angles['y'] = prev_right_hip_angles['y']
                    right_hip_angles['r'] = prev_right_hip_angles['r']
                    left_knee_angle = prev_left_knee_angle
                    right_knee_angle = prev_right_knee_angle
        
            print '--------------------------------------'
        
        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()
        
        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())
    else:
        # re-rendering run (generating only png images)
        for index, target_json in enumerate(json_list):
            # open json file
            with open(target_json) as f:
                json_data = json.load(f)
            # Set angle parameters from json data (not json file!)
            body.set_from_json_data(json_data)
            destination = target_json.split('.')[0]
            scene = Scene()
            pmgr = PluginManager.getInstance()
            # Create a sensor, film & sample generator
            scene.addChild(pmgr.create(sensor_prop))
            # Set the integrator
            scene.addChild(pmgr.create(integrator_prop))
            # Add a light source
            scene.addChild(pmgr.create(emitter_prop))
            # Add body parts
            for prop in body.get_property_list():
                scene.addChild(pmgr.create(prop))
        
            scene.configure()
            scene.setDestinationFile(destination)
        
            # Create a render job and insert it into the queue
            job = RenderJob('myRenderJob' + str(index), scene, queue)
            job.start()
        
        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()
        
        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())
    
    while True:
        print 'Now, Check rendering results and repeat rendering'
        # check png file existence
        flag_list = file_checker(target_list)
        if flag_list.count(False) == 0:
            break
    
        # create a queue for tracking render jobs
        queue = RenderQueue()
    
        # rendering again
        for i, flag in enumerate(flag_list):
            if not flag:
                # open json file
                with open('mit_body_v2_%05i.json' % (i+1)) as f:
                    json_data = json.load(f)
                # Set angle parameters from json data (not json file!)
                body.set_from_json_data(json_data)
                destination = 'mit_body_v2_%05i' % (i+1)
    
                scene = Scene()
                pmgr = PluginManager.getInstance()
                # Create a sensor, film & sample generator
                scene.addChild(pmgr.create(sensor_prop))
                # Set the integrator
                scene.addChild(pmgr.create(integrator_prop))
                # Add a light source
                scene.addChild(pmgr.create(emitter_prop))
                # Add body parts
                for prop in body.get_property_list():
                    scene.addChild(pmgr.create(prop))
    
                scene.configure()
                scene.setDestinationFile(destination)
    
                # Create a render job and insert it into the queue
                job = RenderJob('myRenderJob' + str(i), scene, queue)
                job.start()
    
        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()
    
        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())
    
    # left right flip process (Third-persoon point of view vs. Mirror image)
    if lr_flip_flag:
        print 'Now, generating mirror images'
        for target in target_list:
            img = Image.open(target)
            lr_flip_img = img.transpose(Image.FLIP_LEFT_RIGHT)
            lr_flip_img.save(target.split('.')[0] + 'mirror.png')
            job = RenderJob('myRenderJob' + str(index), scene, queue)
            job.start()
            # Increment index
            index += 1

# wait for all jobs to finish and release resource
queue.waitLeft(0)
queue.join()

# Print some statistics about the rendering process
print(Statistics.getInstance().getStats())

while True:
    print 'Now, Check rendering results and repeat rendering'
    # check png file existence
    flag_list = file_checker(target_list)
    if flag_list.count(False) == 0:
        break

    # create a queue for tracking render jobs
    queue = RenderQueue()

    # rendering again
    for i, flag in enumerate(flag_list):
        if not flag:
            # open json file
            with open('mit_body_v2_%05i.json' % (i+1)) as f:
                json_data = json.load(f)
            # Set angle parameters from json data (not json file!)
            body.set_from_json_data(json_data)
            destination = 'mit_body_v2_%05i' % (i+1)
                str((index + 1) * frame_intaerval - 1), scene, queue)
            job.start()

        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()

        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())

    re_rendering_number = 0

    while True:
        print 'Now, Check rendering results and repeat rendering'
        # check png file existence
        flag_list = file_checker(target_list)
        if flag_list.count(False) == 0:
            break

        # create a queue for tracking render jobs
        queue = RenderQueue()

        # rendering again
        for i, flag in enumerate(flag_list):
            if not flag:
                # open json file
                with open('mit_body_v2_%05i_%05i.json' %
                          (movie_index + 1, ((i + 1) * frame_intaerval))) as f:
                    json_data = json.load(f)
                # Set angle parameters from json data (not json file!)
                body.set_from_json_data(json_data)
def render_one_movie(parameter_list):
    # parameter_list = [num_images, movie_index, num_process]

    # settings
    lower_body_flag = False
    first_person_vire_flag = True
    lr_flip_flag = False
    generate_json_flag = True

    sensor_prop = {'type': 'perspective'}

    if first_person_vire_flag:
        sensor_prop['fov'] = 120.0

        sensor_prop['toWorld'] = Transform.lookAt(
            Point(0, 15 + 9, 3.5),  # Camera origin
            Point(0, 9 + 9, 28.5),  # Camera target
            Vector(0, 1, 0)  # 'up' vector
        )
    else:
        sensor_prop['toWorld'] = Transform.lookAt(
            Point(0, 0, 95),  # Camera origin
            Point(0, 0, 0),  # Camera target
            Vector(0, 1, 0)  # 'up' vector
        )

    sensor_prop['film'] = {
        'type': 'ldrfilm',
        'width': 64,
        'height': 64,
        'banner': False
    }

    sensor_prop['sample'] = {'type': 'ldsampler', 'sampleCount': 16}

    integrator_prop = {'type': 'path'}

    emitter_prop = {'type': 'directional'}
    emitter_prop['irradiance'] = Spectrum(50)

    if first_person_vire_flag:
        emitter_prop['direction'] = Vector(0, -1, 0)
    else:
        emitter_prop['direction'] = Vector(0, 0, -1)

    scheduler = Scheduler.getInstance()

    # Start up the scheduling system with one worker per local core
    for i in range(0, multiprocessing.cpu_count() / parameter_list[2]):
        scheduler.registerWorker(LocalWorker(i, 'wrk%i' % i))
    scheduler.start()

    # create a queue for tracking render jobs
    queue = RenderQueue()

    body = Body(Point(0, 9, 0), lower_body_flag)

    shoulder_limits = {'p': [-180, 25], 'y': [-90, 30], 'r': [-180, 180]}

    elbow_limits = [0, 135]

    hip_limits = {'p': [-125, 15], 'y': [-90, 60], 'r': [-30, 70]}

    knee_limits = [0, 150]

    left_shoulder_angles = {'p': -85, 'y': -30, 'r': 0}

    right_shoulder_angles = {'p': -85, 'y': -30, 'r': 0}

    left_elbow_angle = 70

    right_elbow_angle = 70

    prev_left_shoulder_angles = {}

    prev_right_shoulder_angles = {}

    prev_left_elbow_angle = 0

    prev_right_elbow_angle = 0

    body.left_arm.set_joint_angles(left_shoulder_angles['p'],
                                   left_shoulder_angles['y'],
                                   left_shoulder_angles['r'], left_elbow_angle)
    body.right_arm.set_joint_angles(right_shoulder_angles['p'],
                                    right_shoulder_angles['y'],
                                    right_shoulder_angles['r'],
                                    right_elbow_angle)

    if lower_body_flag:
        left_hip_angles = {'p': -55, 'y': -15, 'r': 20}

        right_hip_angles = {'p': -55, 'y': -15, 'r': 20}

        left_knee_angle = 75

        right_knee_angle = 75

        prev_left_hip_angles = {}

        prev_right_hip_angles = {}

        prev_left_knee_angle = 0

        prev_right_knee_angle = 0

        body.left_leg.set_joint_angles(left_hip_angles['p'],
                                       left_hip_angles['y'],
                                       left_hip_angles['r'], left_knee_angle)
        body.right_leg.set_joint_angles(right_hip_angles['p'],
                                        right_hip_angles['y'],
                                        right_hip_angles['r'],
                                        right_knee_angle)

    index = 0

    target_list = [
        'mit_body_v2_%03i_%05i' % (parameter_list[1], i + 1) + '.png'
        for i in xrange(parameter_list[0])
    ]
    if not generate_json_flag:
        json_list = [
            'mit_body_v2_%03i_%05i' % (parameter_list[1], i + 1) + '.json'
            for i in xrange(parameter_list[0])
        ]

    if generate_json_flag:
        # Normal run (generating json & png images)
        while (index < parameter_list[0]):
            destination = 'mit_body_v2_%03i_%05i' % (parameter_list[1],
                                                     index + 1)
            scene = Scene()
            pmgr = PluginManager.getInstance()
            # Create a sensor, film & sample generator
            scene.addChild(pmgr.create(sensor_prop))
            # Set the integrator
            scene.addChild(pmgr.create(integrator_prop))
            # Add a light source
            scene.addChild(pmgr.create(emitter_prop))

            prev_left_shoulder_angles = left_shoulder_angles
            prev_right_shoulder_angles = right_shoulder_angles
            prev_left_elbow_angle = left_elbow_angle
            prev_right_elbow_angle = right_elbow_angle

            if lower_body_flag:
                prev_left_hip_angles = left_hip_angles
                prev_right_hip_angles = right_hip_angles
                prev_left_knee_angle = left_knee_angle
                prev_right_knee_angle = right_knee_angle

            temp1 = left_shoulder_angles['p'] + randint(-1, 2)
            if ((temp1 < shoulder_limits['p'][0])
                    or (temp1 > shoulder_limits['p'][1])):
                continue

            temp2 = left_shoulder_angles['y'] + randint(-1, 2)
            if ((temp2 < shoulder_limits['y'][0])
                    or (temp2 > shoulder_limits['y'][1])):
                continue

            temp3 = left_shoulder_angles['r'] + randint(-1, 2)
            if ((temp3 < shoulder_limits['r'][0])
                    or (temp3 > shoulder_limits['r'][1])):
                continue

            temp4 = right_shoulder_angles['p'] + randint(-1, 2)
            if ((temp4 < shoulder_limits['p'][0])
                    or (temp4 > shoulder_limits['p'][1])):
                continue

            temp5 = right_shoulder_angles['y'] + randint(-1, 2)
            if ((temp5 < shoulder_limits['y'][0])
                    or (temp5 > shoulder_limits['y'][1])):
                continue

            temp6 = right_shoulder_angles['r'] + randint(-1, 2)
            if ((temp6 < shoulder_limits['r'][0])
                    or (temp6 > shoulder_limits['r'][1])):
                continue

            temp7 = left_elbow_angle + randint(-1, 2)
            if ((temp7 < elbow_limits[0]) or (temp7 > elbow_limits[1])):
                continue

            temp8 = right_elbow_angle + randint(-1, 2)
            if ((temp8 < elbow_limits[0]) or (temp8 > elbow_limits[1])):
                continue

            if lower_body_flag:
                temp9 = left_hip_angles['p'] + randint(-1, 2)
                if ((temp9 < hip_limits['p'][0])
                        or (temp9 > hip_limits['p'][1])):
                    continue

                temp10 = left_hip_angles['y'] + randint(-1, 2)
                if ((temp10 < hip_limits['y'][0])
                        or (temp10 > hip_limits['y'][1])):
                    continue

                temp11 = left_hip_angles['r'] + randint(-1, 2)
                if ((temp11 < hip_limits['r'][0])
                        or (temp11 > hip_limits['r'][1])):
                    continue

                temp12 = right_hip_angles['p'] + randint(-1, 2)
                if ((temp12 < hip_limits['p'][0])
                        or (temp12 > hip_limits['p'][1])):
                    continue

                temp13 = right_hip_angles['y'] + randint(-1, 2)
                if ((temp13 < hip_limits['y'][0])
                        or (temp13 > hip_limits['y'][1])):
                    continue

                temp14 = right_hip_angles['r'] + randint(-1, 2)
                if ((temp14 < hip_limits['r'][0])
                        or (temp14 > hip_limits['r'][1])):
                    continue

                temp15 = left_knee_angle + randint(-1, 2)
                if ((temp15 < knee_limits[0]) or (temp15 > knee_limits[1])):
                    continue

                temp16 = right_knee_angle + randint(-1, 2)
                if ((temp16 < knee_limits[0]) or (temp16 > knee_limits[1])):
                    continue

            left_shoulder_angles = dict(
                zip(['p', 'y', 'r'], [temp1, temp2, temp3]))
            right_shoulder_angles = dict(
                zip(['p', 'y', 'r'], [temp4, temp5, temp6]))
            left_elbow_angle = temp7
            right_elbow_angle = temp8

            if lower_body_flag:
                left_hip_angles = dict(
                    zip(['p', 'y', 'r'], [temp9, temp10, temp11]))
                right_hip_angles = dict(
                    zip(['p', 'y', 'r'], [temp12, temp13, temp14]))
                left_knee_angle = temp15
                right_knee_angle = temp16

            body.left_arm.set_joint_angles(left_shoulder_angles['p'],
                                           left_shoulder_angles['y'],
                                           left_shoulder_angles['r'],
                                           left_elbow_angle)
            body.right_arm.set_joint_angles(right_shoulder_angles['p'],
                                            right_shoulder_angles['y'],
                                            right_shoulder_angles['r'],
                                            right_elbow_angle)

            if lower_body_flag:
                body.left_leg.set_joint_angles(left_hip_angles['p'],
                                               left_hip_angles['y'],
                                               left_hip_angles['r'],
                                               left_knee_angle)
                body.right_leg.set_joint_angles(right_hip_angles['p'],
                                                right_hip_angles['y'],
                                                right_hip_angles['r'],
                                                right_knee_angle)

            cur_left_elbow = body.left_arm.calc_elbow_point()
            cur_right_elbow = body.right_arm.calc_elbow_point()
            cur_left_hand = body.left_arm.calc_hand_point()
            cur_left_hand = body.right_arm.calc_hand_point()

            departure_flag = (cur_left_elbow.z < 0) or (
                cur_right_elbow.z < 0) or (cur_left_hand.z <
                                           0) or (cur_left_hand.z < 0)

            if ((body.is_collision_body_parts() == False)
                    and (departure_flag == False)):
                print '\033[94mcollision detection passed!\033[0m'
                # Add body parts
                for prop in body.get_property_list():
                    scene.addChild(pmgr.create(prop))

                json_data = body.constr_json_data()

                with open('mit_body_v2_%05i.json' % (index + 1), 'w') as f:
                    json.dump(json_data, f, indent=2)

                scene.configure()
                scene.setDestinationFile(destination)

                # Create a render job and insert it into the queue
                job = RenderJob('myRenderJob' + str(index), scene, queue)

                while True:
                    # Check current number of thread
                    num_thread = queue.getJobCount()
                    if num_thread > 1000:
                        time.sleep(1)
                    else:
                        break

                job.start()
                # Increment index
                index += 1
            else:
                body.left_arm.set_joint_angles(prev_left_shoulder_angles['p'],
                                               prev_left_shoulder_angles['y'],
                                               prev_left_shoulder_angles['r'],
                                               prev_left_elbow_angle)
                body.right_arm.set_joint_angles(
                    prev_right_shoulder_angles['p'],
                    prev_right_shoulder_angles['y'],
                    prev_right_shoulder_angles['r'], prev_right_elbow_angle)
                left_shoulder_angles['p'] = prev_left_shoulder_angles['p']
                left_shoulder_angles['y'] = prev_left_shoulder_angles['y']
                left_shoulder_angles['r'] = prev_left_shoulder_angles['r']
                right_shoulder_angles['p'] = prev_right_shoulder_angles['p']
                right_shoulder_angles['y'] = prev_right_shoulder_angles['y']
                right_shoulder_angles['r'] = prev_right_shoulder_angles['r']
                left_elbow_angle = prev_left_elbow_angle
                right_elbow_angle = prev_right_elbow_angle

                if lower_body_flag:
                    body.left_leg.set_joint_angles(prev_left_hip_angles['p'],
                                                   prev_left_hip_angles['y'],
                                                   prev_left_hip_angles['r'],
                                                   prev_left_knee_angle)
                    body.right_leg.set_joint_angles(prev_right_hip_angles['p'],
                                                    prev_right_hip_angles['y'],
                                                    prev_right_hip_angles['r'],
                                                    prev_right_knee_angle)
                    left_hip_angles['p'] = prev_left_hip_angles['p']
                    left_hip_angles['y'] = prev_left_hip_angles['y']
                    left_hip_angles['r'] = prev_left_hip_angles['r']
                    right_hip_angles['p'] = prev_right_hip_angles['p']
                    right_hip_angles['y'] = prev_right_hip_angles['y']
                    right_hip_angles['r'] = prev_right_hip_angles['r']
                    left_knee_angle = prev_left_knee_angle
                    right_knee_angle = prev_right_knee_angle

            print '--------------------------------------'

        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()

        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())
    else:
        # re-rendering run (generating only png images)
        for index, target_json in enumerate(json_list):
            # open json file
            with open(target_json) as f:
                json_data = json.load(f)
            # Set angle parameters from json data (not json file!)
            body.set_from_json_data(json_data)
            destination = target_json.split('.')[0]
            scene = Scene()
            pmgr = PluginManager.getInstance()
            # Create a sensor, film & sample generator
            scene.addChild(pmgr.create(sensor_prop))
            # Set the integrator
            scene.addChild(pmgr.create(integrator_prop))
            # Add a light source
            scene.addChild(pmgr.create(emitter_prop))
            # Add body parts
            for prop in body.get_property_list():
                scene.addChild(pmgr.create(prop))

            scene.configure()
            scene.setDestinationFile(destination)

            # Create a render job and insert it into the queue
            job = RenderJob('myRenderJob' + str(index), scene, queue)
            job.start()

        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()

        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())

    while True:
        print 'Now, Check rendering results and repeat rendering'
        # check png file existence
        flag_list = file_checker(target_list)
        if flag_list.count(False) == 0:
            break

        # create a queue for tracking render jobs
        queue = RenderQueue()

        # rendering again
        for i, flag in enumerate(flag_list):
            if not flag:
                # open json file
                with open('mit_body_v2_%05i.json' % (i + 1)) as f:
                    json_data = json.load(f)
                # Set angle parameters from json data (not json file!)
                body.set_from_json_data(json_data)
                destination = 'mit_body_v2_%05i' % (i + 1)

                scene = Scene()
                pmgr = PluginManager.getInstance()
                # Create a sensor, film & sample generator
                scene.addChild(pmgr.create(sensor_prop))
                # Set the integrator
                scene.addChild(pmgr.create(integrator_prop))
                # Add a light source
                scene.addChild(pmgr.create(emitter_prop))
                # Add body parts
                for prop in body.get_property_list():
                    scene.addChild(pmgr.create(prop))

                scene.configure()
                scene.setDestinationFile(destination)

                # Create a render job and insert it into the queue
                job = RenderJob('myRenderJob' + str(i), scene, queue)
                job.start()

        # wait for all jobs to finish and release resource
        queue.waitLeft(0)
        queue.join()

        # Print some statistics about the rendering process
        print(Statistics.getInstance().getStats())

    # left right flip process (Third-persoon point of view vs. Mirror image)
    if lr_flip_flag:
        print 'Now, generating mirror images'
        for target in target_list:
            img = Image.open(target)
            lr_flip_img = img.transpose(Image.FLIP_LEFT_RIGHT)
            lr_flip_img.save(target.split('.')[0] + 'mirror.png')