LJ/plugins/VJing/poses.py

599 lines
22 KiB
Python

#!/usr/bin/python2.7
# -*- coding: utf-8 -*-
# -*- mode: Python -*-
'''
Laser Jaying
LICENCE : CC
Sam Neurohack, Loloster,
Openpose json files animations
Set for amiral castle :
Curve 0 : Mapping
Curve 1 : Pose align on Laser 0 for the moment
Curve 2 : Faces
Curve 3 : Dancers
'''
import math
import gstt
from globalVars import *
import bhoroscp
import colorify
import numpy as np
import pdb
import time
from datetime import datetime
import settings
# For Mapping()
# dedicated settings handler is in settings.py
import pygame
f_sine = 0
# Curve 0
# Edit shape mode / Run Mode
def MappingConf(section):
global mouse_prev, sections
print ""
print "For Mapping(), reading Architecture Points"
gstt.EditStep = 0
gstt.CurrentWindow = -1
gstt.CurrentCorner = 0
gstt.CurrentSection = section
mouse_prev = ((405, 325), (0, 0, 0))
# Get all shapes points (="corners") for the given section of the conf file -> gstt.Windows
gstt.Windows = []
sections = settings.MappingSections()
print ""
#print "Sections : ", sections
print "Reading Section : ", sections[gstt.CurrentSection]
gstt.Laser = settings.MappingRead([sections[gstt.CurrentSection],'laser'])
print "Laser : ", gstt.Laser
gstt.simuPL = gstt.Laser
for Window in xrange(settings.Mapping(sections[gstt.CurrentSection])-1):
print "Reading option : ", str(Window)
shape = [sections[gstt.CurrentSection], str(Window)]
WindowPoints = settings.MappingRead(shape)
gstt.Windows.append(WindowPoints)
print "Section points : " ,gstt.Windows
# section 0 is "General", then first screen shapes in section 1
# Todo : Should search automatically first screen in settings file sections.
# MappingConf(1) should be call only if curve 0 is selected
def Mapping(fwork, keystates, keystates_prev):
global mouse_prev, sections
PL = gstt.Laser
dots = []
#switch to edit mode Key E ?
if keystates[pygame.K_e] and not keystates_prev[pygame.K_e] and gstt.EditStep == 0:
print "Switching to Edit Mode"
gstt.EditStep = 1
gstt.CurrentWindow = 0
gstt.CurrentCorner = 0
# Back to normal if ENTER key is pressed ?
if keystates[pygame.K_RETURN] and gstt.EditStep == 1:
print "Switching to Run Mode"
gstt.EditStep =0
# EDIT MODE : cycle windows if press e key to adjust corner position
# Escape edit mode with enter key
if gstt.EditStep >0:
dots = []
CurrentWindowPoints = gstt.Windows[gstt.CurrentWindow]
# Draw all windows points or "corners"
for corner in xrange(len(CurrentWindowPoints)):
dots.append(proj(int(CurrentWindowPoints[corner][0]),int(CurrentWindowPoints[corner][1]),0))
fwork.PolyLineOneColor( dots, c=colorify.rgb2hex(gstt.color), PL = PL, closed = False )
# Left mouse is clicked, modify current Corner coordinate
if gstt.mouse[1][0] == mouse_prev[1][0] and mouse_prev[1][0] == 1:
deltax = gstt.mouse[0][0]-mouse_prev[0][0]
deltay = gstt.mouse[0][1]-mouse_prev[0][1]
CurrentWindowPoints[gstt.CurrentCorner][0] += (deltax *2)
CurrentWindowPoints[gstt.CurrentCorner][1] -= (deltay * 2)
# Change corner if Z key is pressed.
if keystates[pygame.K_z] and not keystates_prev[pygame.K_z]:
if gstt.CurrentCorner < settings.Mapping(sections[gstt.CurrentSection]) - 1:
gstt.CurrentCorner += 1
print "Corner : ", gstt.CurrentCorner
# Press E inside Edit mode : Next window
if keystates[pygame.K_e] and not keystates_prev[pygame.K_e]:
# Save current Window and switch to the next one.
if gstt.CurrentWindow < settings.Mapping(sections[gstt.CurrentSection]) -1:
print "saving "
settings.MappingWrite(sections,str(gstt.CurrentWindow),CurrentWindowPoints)
gstt.CurrentWindow += 1
gstt.CurrentCorner = -1
if gstt.CurrentWindow == settings.Mapping(sections[gstt.CurrentSection]) -1:
gstt.EditStep == 0
gstt.CurrentWindow = 0
print "Now Editing window ", gstt.CurrentWindow
mouse_prev = gstt.mouse
gstt.PL[PL] = fwork.LinesPL(PL)
# Press A : Next section ?
if keystates[pygame.K_a] and not keystates_prev[pygame.K_a]:
print "current section : ", gstt.CurrentSection
if gstt.CurrentSection < len(sections)-1:
gstt.CurrentSection += 1
print "Next section name is ", sections[gstt.CurrentSection]
if "screen" in sections[gstt.CurrentSection]:
print ""
print "switching to section ", gstt.CurrentSection, " ", sections[gstt.CurrentSection]
MappingConf(gstt.CurrentSection)
else:
gstt.CurrentSection = -1
# RUN MODE
if gstt.EditStep == 0:
# Add all windows to PL for display
for Window in gstt.Windows:
dots = []
for corner in xrange(len(Window)):
#print "Editing : ", WindowPoints[corner]
#print Window[corner][0]
dots.append(proj(int(Window[corner][0]),int(Window[corner][1]),0))
fwork.PolyLineOneColor( dots, c=colorify.rgb2hex(gstt.color), PL = PL, closed = False )
gstt.PL[PL] = fwork.LinesPL(PL)
# Curve 1 : generic pose animations
import json
gstt.CurrentPose = 1
'''
# get absolute body position points
def getCOCO(pose_json,pose_points):
dots = []
for dot in pose_points:
if len(pose_json['part_candidates'][0][str(dot)]) != 0:
dots.append((pose_json['part_candidates'][0][str(dot)][0], pose_json['part_candidates'][0][str(dot)][1]))
return dots
# get relative (-1 0 1) body position points. a position -1, -1 means doesn't exist
def getBODY(pose_json,pose_points):
dots = []
for dot in pose_points:
#print pose_points
if len(pose_json['people'][0]['pose_keypoints_2d']) != 0:
#print "people 0"
if pose_json['people'][0]['pose_keypoints_2d'][dot * 3] != -1 and pose_json['people'][0]['pose_keypoints_2d'][(dot * 3)+1] != -1:
dots.append((pose_json['people'][0]['pose_keypoints_2d'][dot * 3], pose_json['people'][0]['pose_keypoints_2d'][(dot * 3)+1]))
#if len(pose_json['people']) != 1:
#print "people1"
#print "people 1", pose_json['people'][1]['pose_keypoints_2d']
#print len(pose_json['people'])
return dots
# get absolute face position points
def getFACE(pose_json,pose_points):
dots = []
for dot in pose_points:
if len(pose_json['people'][0]['face_keypoints_2d']) != 0:
print "people 0"
if pose_json['people'][0]['face_keypoints_2d'][dot * 3] != -1 and pose_json['people'][0]['face_keypoints_2d'][(dot * 3)+1] != -1:
dots.append((pose_json['people'][0]['face_keypoints_2d'][dot * 3], pose_json['people'][0]['face_keypoints_2d'][(dot * 3)+1]))
if len(pose_json['people']) != 1:
print "people 1"
#print "people 1", pose_json['people'][1]['face_keypoints_2d']
return dots
# Body parts
def bodyCOCO(pose_json):
pose_points = [10,9,8,1,11,12,13]
return getBODY(pose_json,pose_points)
def armCOCO(pose_json):
pose_points = [7,6,5,1,2,3,4]
return getBODY(pose_json,pose_points)
def headCOCO(pose_json):
pose_points = [1,0]
return getBODY(pose_json,pose_points)
# Face keypoints
def face(pose_json):
pose_points = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
return getFACE(pose_json,pose_points)
def browL(pose_json):
pose_points = [26,25,24,23,22]
return getFACE(pose_json,pose_points)
def browR(pose_json):
pose_points = [21,20,19,18,17]
return getFACE(pose_json,pose_points)
def eyeR(pose_json):
pose_points = [36,37,38,39,40,41,36]
return getFACE(pose_json,pose_points)
def eyeL(pose_json):
pose_points = [42,43,44,45,46,47,42]
return getFACE(pose_json,pose_points)
def nose(pose_json):
pose_points = [27,28,29,30]
return getFACE(pose_json,pose_points)
def mouth(pose_json):
pose_points = [48,59,58,57,56,55,54,53,52,51,50,49,48,60,67,66,65,64,63,62,61,60]
return getFACE(pose_json,pose_points)
# best order face : face browL browr eyeR eyeL nose mouth
'''
# get absolute body position points
def getCOCO(pose_json,pose_points, people):
dots = []
for dot in pose_points:
if len(pose_json['part_candidates'][people][str(dot)]) != 0:
dots.append((pose_json['part_candidates'][people][str(dot)][0], pose_json['part_candidates'][people][str(dot)][1]))
return dots
# get relative (-1 0 1) body position points. a position -1, -1 means doesn't exist
def getBODY(pose_json,pose_points, people):
dots = []
for dot in pose_points:
#print pose_points
if len(pose_json['people'][people]['pose_keypoints_2d']) != 0:
#print "people 0"
if pose_json['people'][people]['pose_keypoints_2d'][dot * 3] != -1 and pose_json['people'][people]['pose_keypoints_2d'][(dot * 3)+1] != -1:
dots.append((pose_json['people'][people]['pose_keypoints_2d'][dot * 3], pose_json['people'][people]['pose_keypoints_2d'][(dot * 3)+1]))
return dots
# get absolute face position points
def getFACE(pose_json,pose_points, people):
dots = []
for dot in pose_points:
if len(pose_json['people'][people]['face_keypoints_2d']) != 0:
#print "people 0"
if pose_json['people'][people]['face_keypoints_2d'][dot * 3] != -1 and pose_json['people'][people]['face_keypoints_2d'][(dot * 3)+1] != -1:
dots.append((pose_json['people'][people]['face_keypoints_2d'][dot * 3], pose_json['people'][people]['face_keypoints_2d'][(dot * 3)+1]))
'''
if len(pose_json['people']) > 1:
print len(pose_json['people'])
print "people 1 face ", pose_json['people'][1]['face_keypoints_2d']
'''
return dots
# Body parts
def bodyCOCO(pose_json, people):
pose_points = [10,9,8,1,11,12,13]
return getBODY(pose_json,pose_points, people)
def armCOCO(pose_json, people):
pose_points = [7,6,5,1,2,3,4]
return getBODY(pose_json,pose_points, people)
def headCOCO(pose_json, people):
pose_points = [1,0]
return getBODY(pose_json,pose_points, people)
# Face keypoints
def face(pose_json, people):
pose_points = [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16]
return getFACE(pose_json,pose_points, people)
def browL(pose_json, people):
pose_points = [26,25,24,23,22]
return getFACE(pose_json,pose_points, people)
def browR(pose_json, people):
pose_points = [21,20,19,18,17]
return getFACE(pose_json,pose_points, people)
def eyeR(pose_json, people):
pose_points = [36,37,38,39,40,41,36]
return getFACE(pose_json,pose_points, people)
def eyeL(pose_json, people):
pose_points = [42,43,44,45,46,47,42]
return getFACE(pose_json,pose_points, people)
def nose(pose_json, people):
pose_points = [27,28,29,30]
return getFACE(pose_json,pose_points, people)
def mouth(pose_json, people):
pose_points = [48,59,58,57,56,55,54,53,52,51,50,49,48,60,67,66,65,64,63,62,61,60]
return getFACE(pose_json,pose_points, people)
import os
# Get frame number for pose path describe in gstt.PoseDir
def lengthPOSE(pose_dir):
if gstt.debug > 0:
print "Check directory ",'poses/' + pose_dir + '/'
numfiles = sum(1 for f in os.listdir('poses/' + pose_dir + '/') if os.path.isfile(os.path.join('poses/' + pose_dir + '/', f)) and f[0] != '.')
if gstt.debug > 0:
print "Pose : ", pose_dir, numfiles, "images"
return numfiles
def preparePOSE():
# anim format (name, xpos,ypos, resize, currentframe, totalframe, count, speed)
# total frames is fetched from directory file count
anims1 = [['sky',50,100,300,0,0,0,1],['2dancer1', 400,100, 300,0,0,0,1],['1dancer', 400,100, 300,0,0,0,1],['window1',100,100,300,0,0,0,1]]
anims2 = [['window1', 400,200, 300,0,0,0,1],['2dancer1',100,200,300,0,0,0,1]]
for anim in anims1:
anim[5]= lengthPOSE(anim[0])
gstt.anims0 = anims1
# display n pose animations on Laser 0
def Pose(fwork):
for anim in gstt.anims0:
PL = 0
dots = []
print anim, anim[5]
# repeat anim[7] time the same frame
anim[6] +=1
if anim[6] == anim[7]:
anim[6] = 0
# increase current frame and compare to total frame
anim[4] += 1
if anim[4] == anim[5]:
anim[4] = 0
posename = 'poses/' + anim[0] + '/' + anim[0] +'-'+str("%05d"%anim[4])+'.json'
posefile = open(posename , 'r')
posedatas = posefile.read()
pose_json = json.loads(posedatas)
for people in range(len(pose_json['people'])):
fwork.rPolyLineOneColor(bodyCOCO(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(armCOCO(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(headCOCO(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
# Face
'''
#fwork.rPolyLineOneColor(face(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(nose(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(mouth(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
'''
gstt.PL[PL] = fwork.LinesPL(PL)
time.sleep(0.02)
# decrease current frame
if gstt.keystates[pygame.K_w]: # and not gstt.keystates_prev[pygame.K_w]:
gstt.CurrentPose -= 1
if gstt.CurrentPose < 2:
gstt.CurrentPose = gstt.numfiles -1
#time.sleep(0.033)
print "Frame : ",gstt.CurrentPose
# increaser current frame
if gstt.keystates[pygame.K_x]: # and not gstt.keystates_prev[pygame.K_x]:
gstt.CurrentPose += 1
if gstt.CurrentPose > gstt.numfiles -1:
gstt.CurrentPose = 1
#time.sleep(0.033)
print "Frame : ",gstt.CurrentPose
# Curve 2 Faces
import json
gstt.CurrentPose = 1
def prepareFACES():
# anim format (name, xpos,ypos, resize, currentframe, totalframe, count, speed)
# total frame is fetched from directory file count
gstt.anims[0] = [['detroit1', 300,300, 100,0,0,0,1]]
gstt.anims[1] = [['detroit1', 400,200, 200,0,0,0,1]]
gstt.anims[2] = [['detroit1', 500,200, 300,0,0,0,1]]
'''
# read anims number of frames from disk.
for anim in range(len(gstt.anims0)):
gstt.anims0[anim][5]= lengthPOSE(gstt.anims0[anim][0])
for anim in range(len(gstt.anims1)):
gstt.anims1[anim][5]= lengthPOSE(gstt.anims1[anim][0])
for anim in range(len(gstt.anims2)):
gstt.anims2[anim][5]= lengthPOSE(gstt.anims2[anim][0])
'''
for laseranims in range(3):
print laseranims
for anim in range(len(gstt.anims[laseranims])):
gstt.anims[laseranims][anim][5]= lengthPOSE(gstt.anims[laseranims][anim][0])
# display the face animation describe in gstt.PoseDir
def Faces(fwork):
for laseranims in range(3):
for anim in gstt.anims[laseranims]:
PL = laseranims
#print PL, anim
dots = []
#print anim, anim[5]
# repeat anim[7] time the same frame
anim[6] +=1
if anim[6] == anim[7]:
anim[6] = 0
# increase current frame and compare to total frame
anim[4] += 1
if anim[4] == anim[5]:
anim[4] = 0
posename = 'poses/' + anim[0] + '/' + anim[0] +'-'+str("%05d"%anim[4])+'.json'
posefile = open(posename , 'r')
posedatas = posefile.read()
pose_json = json.loads(posedatas)
# Face
for people in range(len(pose_json['people'])):
#fwork.rPolyLineOneColor(face(pose), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(nose(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(mouth(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
gstt.PL[PL] = fwork.LinesPL(PL)
time.sleep(0.02)
# Curve 3
# Dancers
import json
gstt.CurrentPose = 1
def prepareDANCERS():
# anim format (name, xpos,ypos, resize, currentframe, totalframe, count, speed)
# total frame is fetched from directory file count
gstt.anims[0] = [['1dancer',500,200,300,0,0,0,10]]
gstt.anims[1] = [['2dancer1',500,200,300,0,0,0,10]]
gstt.anims[2] = [['window1',500,200,300,0,0,0,10]]
#gstt.anims[1] = [['2dancer1',100,200,300,0,0,0,10]]
#gstt.anims[2] = [['window1',400,200, 300,0,0,0,10]]
# read anims number of frames from disk.
print gstt.anims
for laseranims in range(3):
print laseranims
for anim in range(len(gstt.anims[laseranims])):
gstt.anims[laseranims][anim][5]= lengthPOSE(gstt.anims[laseranims][anim][0])
# display the pose animation describe in gstt.PoseDir
def Dancers(fwork):
for laseranims in range(3):
for anim in gstt.anims[laseranims]:
PL = laseranims
#print PL, anim
dots = []
#print anim, anim[5]
# repeat anim[7] time the same frame
anim[6] +=1
if anim[6] == anim[7]:
anim[6] = 0
# increase current frame and compare to total frame
anim[4] += 1
if anim[4] == anim[5]:
anim[4] = 0
#bhorosc.sendresol("/layer1/clip1/connect",1)
#bhorosc.sendresol("/layer1/clip1/connect",0)
posename = 'poses/' + anim[0] + '/' + anim[0] +'-'+str("%05d"%anim[4])+'.json'
posefile = open(posename , 'r')
posedatas = posefile.read()
pose_json = json.loads(posedatas)
for people in range(len(pose_json['people'])):
fwork.rPolyLineOneColor(bodyCOCO(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(armCOCO(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(browR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeR(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(eyeL(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(nose(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(mouth(pose_json, people), c=colorify.rgb2hex(gstt.color), PL = laseranims, closed = False,xpos = anim[1], ypos = anim[2], resize = anim[3])
gstt.PL[PL] = fwork.LinesPL(PL)
'''
fwork.rPolyLineOneColor(bodyCOCO(pose_json), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(armCOCO(pose_json), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
fwork.rPolyLineOneColor(headCOCO(pose_json), c=colorify.rgb2hex(gstt.color), PL = 0, closed = False, xpos = anim[1], ypos = anim[2], resize = anim[3])
gstt.PL[PL] = fwork.LinesPL(PL)
'''