forked from protonphoton/LJ
Plugins mamagement
This commit is contained in:
parent
9ecee93b43
commit
c27151ec62
38 changed files with 3934 additions and 550 deletions
|
|
@ -1,255 +0,0 @@
|
|||
"""
|
||||
Directions Buttons defined correctly only for PS3 and USBJoystick
|
||||
|
||||
|
||||
Represent various videogame controllers
|
||||
|
||||
TODO: Various play schemes/configs
|
||||
XXX: UNTESTED
|
||||
"""
|
||||
|
||||
import re
|
||||
|
||||
def setup_controls(joystick):
|
||||
"""
|
||||
Joystick wrapper.
|
||||
"""
|
||||
if re.search('playstation', joystick.get_name(), re.I):
|
||||
return Ps3Controller(joystick)
|
||||
|
||||
elif re.search('X-box', joystick.get_name(), re.I):
|
||||
return XboxController(joystick)
|
||||
|
||||
elif re.search('Saitek', joystick.get_name(), re.I):
|
||||
return MySaitekController(joystick)
|
||||
|
||||
elif re.search('Thrustmaster dual analog 3.2', joystick.get_name(), re.I):
|
||||
return MyThrustController(joystick)
|
||||
|
||||
elif re.search('2n1 USB', joystick.get_name(), re.I):
|
||||
return CSLController(joystick)
|
||||
|
||||
elif re.search('Joystick', joystick.get_name(), re.I):
|
||||
return USBController(joystick)
|
||||
|
||||
return Controller(joystick)
|
||||
|
||||
class Controller(object):
|
||||
|
||||
def __init__(self, joystick):
|
||||
"""Pass a PyGame joystick instance."""
|
||||
self.js = joystick
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_button(9)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(2)
|
||||
|
||||
class XboxController(Controller):
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(XboxController, self).__init__(joystick)
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(4)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(11)
|
||||
|
||||
class Ps3Controller(Controller):
|
||||
|
||||
#up 4 _DOWN 6 left 7 right 5 croix 14 rond 13 triangle 12
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(Ps3Controller, self).__init__(joystick)
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
# TODO: Verify
|
||||
return self.js.get_button(8)
|
||||
|
||||
def getRightTrigger(self):
|
||||
# TODO: Verify
|
||||
return self.js.get_button(9)
|
||||
|
||||
def getUp(self):
|
||||
return self.js.get_button(4)
|
||||
|
||||
def getDown(self):
|
||||
return self.js.get_button(6)
|
||||
|
||||
def getLeft(self):
|
||||
return self.js.get_button(7)
|
||||
|
||||
def getRight(self):
|
||||
return self.js.get_button(5)
|
||||
|
||||
def getFire1(self):
|
||||
return self.js.get_button(14)
|
||||
|
||||
def getFire2(self):
|
||||
return self.js.get_button(13)
|
||||
|
||||
|
||||
class MySaitekController(Controller):
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(MySaitekController, self).__init__(joystick)
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_button(6)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(7)
|
||||
|
||||
class MyThrustController(Controller):
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(MyThrustController, self).__init__(joystick)
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_button(5)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(7)
|
||||
|
||||
|
||||
class CSLController(Controller):
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(CSLController, self).__init__(joystick)
|
||||
|
||||
def getLeftHori(self):
|
||||
return self.js.get_axis(2)
|
||||
|
||||
def getLeftVert(self):
|
||||
return self.js.get_axis(3)
|
||||
|
||||
def getRightHori(self):
|
||||
return self.js.get_axis(0)
|
||||
|
||||
def getRightVert(self):
|
||||
return self.js.get_axis(1)
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_button(6)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(7)
|
||||
|
||||
def getFire1(self):
|
||||
return self.js.get_button(2)
|
||||
|
||||
def getFire2(self):
|
||||
return self.js.get_button(1)
|
||||
|
||||
class USBController(Controller):
|
||||
|
||||
|
||||
# my USB Joystick
|
||||
#up axis 0 -1 DOWN axis 0 1 left axis 1 1 right axis 1 -1 bouton gauche 10 bouton droite 9
|
||||
|
||||
def __init__(self, joystick):
|
||||
super(USBController, self).__init__(joystick)
|
||||
|
||||
|
||||
def getUp(self):
|
||||
if self.js.get_axis(0) == -1:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def getDown(self):
|
||||
if self.js.get_axis(0) > 0.9:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def getLeft(self):
|
||||
if self.js.get_axis(1) == 1:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def getRight(self):
|
||||
if self.js.get_axis(1) == -1:
|
||||
return 1
|
||||
else:
|
||||
return 0
|
||||
|
||||
def getLeftTrigger(self):
|
||||
return self.js.get_button(10)
|
||||
|
||||
def getRightTrigger(self):
|
||||
return self.js.get_button(9)
|
||||
|
||||
def getFire1(self):
|
||||
if self.js.get_button(10) == 1:
|
||||
print "fire 1"
|
||||
return self.js.get_button(10)
|
||||
|
||||
def getFire2(self):
|
||||
if self.js.get_button(9) == 1:
|
||||
print "fire 2"
|
||||
return self.js.get_button(9)
|
||||
|
||||
|
|
@ -1,259 +0,0 @@
|
|||
#!/usr/bin/python2.7
|
||||
# -*- coding: utf-8 -*-
|
||||
# -*- mode: Python -*-
|
||||
'''
|
||||
|
||||
LJ Laser Pong entities
|
||||
v0.1
|
||||
|
||||
Sam Neurohack
|
||||
|
||||
'''
|
||||
|
||||
|
||||
# STDLIB
|
||||
import math
|
||||
import itertools
|
||||
import sys
|
||||
import os
|
||||
import lj
|
||||
|
||||
import time
|
||||
import random
|
||||
|
||||
|
||||
|
||||
screen_size = [800,600]
|
||||
|
||||
top_left = [200,100]
|
||||
bottom_left = [200,300]
|
||||
top_right = [600,100]
|
||||
bottom_right = [600,300]
|
||||
|
||||
score_pos = [550,40]
|
||||
score2_pos = [259,40]
|
||||
|
||||
# X Y position on bottom left of each paddle (="flips")
|
||||
ball_origin = [400,300,200]
|
||||
text_pos = [300,500,200]
|
||||
BALL_acc = 0.06
|
||||
PADDLE_height = 100
|
||||
PADDLE_width = 10
|
||||
PADDLE3D_height = 100
|
||||
PADDLE3D_width = 100
|
||||
FACT3D = 2
|
||||
FLIPS_lorigin = [10,300,0]
|
||||
FLIPS_rorigin = [780,300,400]
|
||||
flips_attraction = 0.007
|
||||
|
||||
xy_center = [screen_size[0]/2,screen_size[1]/2]
|
||||
|
||||
DEFAULT_SPOKES = range(0,359,60)
|
||||
DEFAULT_PLAYER_EXPLODE_COLOR = 0xFFFF00
|
||||
DEFAULT_SIDE_COUNT = 6
|
||||
DREARRANGE_SIDES = .02
|
||||
|
||||
|
||||
CRASH_SHAKE_MAX = 6
|
||||
TDN_CRASH = 200
|
||||
|
||||
GAME_FS_QUIT = -1
|
||||
GAME_FS_MENU = 0
|
||||
GAME_FS_PLAY = 1
|
||||
GAME_FS_LAUNCH = 2
|
||||
GAME_FS_GAMEOVER = 3
|
||||
|
||||
BUMPERS_COLOR_YELLOW = 0xFFFF00
|
||||
BUMPERS_COLOR_RED = 0xFF0000
|
||||
BUMPERS_COLOR_BLACK = 0x000000
|
||||
BUMPERS_SIZE_X = 60
|
||||
BUMPERS_SIZE_Y = 110
|
||||
BUMPERS_FORCE = 1.1
|
||||
|
||||
|
||||
BALL_SPEED = 5
|
||||
BALL_MAX = 4
|
||||
BALL_SIZE_X = 3
|
||||
BALL_SIZE_Y = 3
|
||||
LASER_ANGLE = 0
|
||||
|
||||
|
||||
|
||||
GRAVITY = 0.0001
|
||||
|
||||
NO_BGM = False
|
||||
#NO_BGM = True
|
||||
|
||||
def rgb2int(r,g,b):
|
||||
return int('0x%02x%02x%02x' % (r,g,b),0)
|
||||
|
||||
white = rgb2int(255,255,255)
|
||||
red = rgb2int(255,0,0)
|
||||
blue = rgb2int(0,0,255)
|
||||
green = rgb2int(0,255,0)
|
||||
|
||||
|
||||
LOGO = [
|
||||
# L/o
|
||||
[[(-140,-100),(-200,20),(40,20)],0xFF00],
|
||||
# aser
|
||||
[[(-140,-40),(-100,-40,),(-120,0),(-160,0),(-110,-20)],0xFFFF],
|
||||
[[(-40,-40),(-60,-40),(-90,-20),(-50,-20),(-80,0),(-100,0)],0xFFFF],
|
||||
[[(-30,-20),(10,-20),(0,-40),(-20,-40),(-30,-20),(-30,0),(-10,0)],0xFFFF],
|
||||
[[(20,0),(40,-40),(35,-30),(50,-40),(70,-40)],0xFFFF],
|
||||
# Pinball
|
||||
[[(-185,50),(-145,50),(-130,20),(-170,20),(-200,80)],0xFFFF00], #P
|
||||
[[(-80,40),(-120,40),(-140,80),(-100,80),(-80,40)],0xFFFF], #O
|
||||
[[(-80,80),(-60,40),(-65,50),(-40,40),(-25,50),(-40,80)],0xFFFF], #N
|
||||
[[(40,40),(0,40),(-20,80),(20,80),(30,60),(10,60)],0xFFFF], #G
|
||||
]
|
||||
|
||||
|
||||
LOGO_OFFSET_X = 460
|
||||
LOGO_OFFSET_Y = 250
|
||||
|
||||
def LogoDraw():
|
||||
'''
|
||||
Dessine le logo
|
||||
'''
|
||||
for pl_color in LOGO:
|
||||
c = pl_color[1]
|
||||
xy_list = []
|
||||
for xy in pl_color[0]:
|
||||
xy_list.append((LOGO_OFFSET_X + xy[0], LOGO_OFFSET_Y + xy[1]))
|
||||
#print xy_list
|
||||
lj.PolyLineOneColor(xy_list, c,0, False)
|
||||
|
||||
|
||||
|
||||
|
||||
FlipsLx, FlipsLy = FLIPS_lorigin[0], FLIPS_lorigin[1]
|
||||
FlipsRx, FlipsRy = FLIPS_rorigin[0], FLIPS_rorigin[1]
|
||||
FlipsSpeed = 7
|
||||
|
||||
|
||||
def FlipsMove(left_key,right_key,up_key,down_key):
|
||||
global FlipsLx, FlipsLy, FlipsRx, FlipsRy
|
||||
|
||||
if left_key:
|
||||
FlipsLy -= FlipsSpeed
|
||||
if FlipsLy < 1:
|
||||
FlipsLy = 1
|
||||
|
||||
if right_key:
|
||||
FlipsLy += FlipsSpeed
|
||||
if FlipsLy > screen_size[1] - PADDLE_height:
|
||||
FlipsLy = screen_size[1] - PADDLE_height
|
||||
|
||||
if up_key:
|
||||
FlipsRy -= FlipsSpeed
|
||||
if FlipsRy < 1:
|
||||
FlipsRy = 1
|
||||
|
||||
if down_key:
|
||||
FlipsRy += FlipsSpeed
|
||||
if FlipsRy > screen_size[1] - PADDLE_height:
|
||||
FlipsRy = screen_size[1] - PADDLE_height
|
||||
|
||||
return FlipsLy, FlipsRy
|
||||
|
||||
def FlipsMoveJoy(left_key,right_key,up_key,down_key,lvertax):
|
||||
|
||||
if left_key:
|
||||
FlipsLy -= FlipsSpeed
|
||||
if FlipsLy < 1:
|
||||
FlipsLy = 1
|
||||
|
||||
if right_key:
|
||||
FlipsLy += FlipsSpeed
|
||||
if FlipsLy > screen_size[1] - PADDLE_height:
|
||||
FlipsLy = screen_size[1] - PADDLE_height
|
||||
|
||||
if up_key:
|
||||
FlipsRy -= FlipsSpeed
|
||||
if FlipsRy < 1:
|
||||
FlipsRy = 1
|
||||
if down_key > 0.01:
|
||||
FlipsRy += FlipsSpeed
|
||||
if FlipsRy > screen_size[1] - PADDLE_height:
|
||||
FlipsRy = screen_size[1] - PADDLE_height
|
||||
|
||||
if lvertax:
|
||||
print lvertax
|
||||
if lvertax < 0:
|
||||
FlipsLy -= FlipsSpeed
|
||||
if FlipsLy < 1:
|
||||
FlipsLy = 1
|
||||
elif lvertax > 0.01:
|
||||
FlipsLy += FlipsSpeed
|
||||
if FlipsLy > screen_size[1] - PADDLE_height:
|
||||
FlipsLy = screen_size[1] - PADDLE_height
|
||||
return FlipsLy, FlipsRy
|
||||
|
||||
def FlipsDraw():
|
||||
|
||||
lj.PolyLineOneColor([(FlipsLx,FlipsLy),(FlipsLx,FlipsLy + PADDLE_height),(FlipsLx + PADDLE_width , FlipsLy + PADDLE_height),(FlipsLx + PADDLE_width,FlipsLy)], white,0,True)
|
||||
lj.PolyLineOneColor([(FlipsRx,FlipsRy),(FlipsRx,FlipsRy + PADDLE_height),(FlipsRx + PADDLE_width , FlipsRy + PADDLE_height),(FlipsRx + PADDLE_width,FlipsRy)], white,0,True)
|
||||
|
||||
|
||||
def FiletDraw():
|
||||
lj.PolyLineOneColor([(screen_size[0]/2,screen_size[1]),(screen_size[0]/2,0)], white, 0,True)
|
||||
|
||||
|
||||
def Score1Draw(score):
|
||||
#print "score1",score
|
||||
lj.Text(str(score),white, 0, 350, 50, 1, 0, 0, 0)
|
||||
|
||||
def Score2Draw(score):
|
||||
#print "score2",score
|
||||
lj.Text(str(score),white, 0, 500, 50, 1, 0, 0, 0)
|
||||
|
||||
|
||||
|
||||
BallX, BallY = ball_origin[0], ball_origin[1]
|
||||
BallZoom = 1
|
||||
|
||||
|
||||
def BallMove(xcoord,ycoord):
|
||||
global BallX,BallY
|
||||
|
||||
BallX = xcoord
|
||||
BallY = ycoord
|
||||
#print "ball move",xcoord,ycoord
|
||||
|
||||
#BallZoom = ?
|
||||
|
||||
if BallX < 0:
|
||||
BallX = 0
|
||||
|
||||
elif BallX >= screen_size[0]:
|
||||
BallX = screen_size[0]
|
||||
|
||||
if BallY < 0:
|
||||
BallY = 0
|
||||
|
||||
elif BallY >= screen_size[1]:
|
||||
BallY = screen_size[1]
|
||||
|
||||
def BallDraw():
|
||||
global BallX,BallY
|
||||
|
||||
xmin = 0
|
||||
xmax = BALL_SIZE_X * 2
|
||||
ymin = 0
|
||||
ymax = BALL_SIZE_Y * 2
|
||||
|
||||
xmin = (xmin*BallZoom)
|
||||
ymin = (ymin*BallZoom)
|
||||
xmax = (xmax*BallZoom)
|
||||
ymax = (ymax*BallZoom)
|
||||
|
||||
xmin += BallX
|
||||
xmax += BallX
|
||||
ymin += BallY
|
||||
ymax += BallY
|
||||
|
||||
#print "ball position",xmin,xmax,ymin,ymax
|
||||
|
||||
lj.PolyLineOneColor([(xmin,ymin),(xmin,ymax),(xmax,ymax),(xmax,ymin)], white,0,True)
|
||||
|
||||
|
|
@ -1,310 +0,0 @@
|
|||
# coding=UTF-8
|
||||
|
||||
'''
|
||||
LJ v0.8.0
|
||||
Some LJ functions useful for python clients (was framy.py)
|
||||
|
||||
Config
|
||||
PolyLineOneColor
|
||||
rPolyLineOneColor
|
||||
Text
|
||||
sendlj : remote control
|
||||
DrawPL
|
||||
|
||||
LICENCE : CC
|
||||
Sam Neurohack
|
||||
|
||||
'''
|
||||
|
||||
import math
|
||||
import redis
|
||||
from OSC import OSCServer, OSCClient, OSCMessage
|
||||
|
||||
redisIP = '127.0.0.1'
|
||||
r = redis.StrictRedis(host=redisIP, port=6379, db=0)
|
||||
|
||||
ClientNumber = 0
|
||||
|
||||
point_list = []
|
||||
pl = [[],[],[],[]]
|
||||
|
||||
|
||||
'''
|
||||
LJIP = "127.0.0.1"
|
||||
|
||||
osclientlj = OSCClient()
|
||||
oscmsg = OSCMessage()
|
||||
osclientlj.connect((redisIP, 8002))
|
||||
'''
|
||||
|
||||
def sendlj(oscaddress,oscargs=''):
|
||||
|
||||
oscmsg = OSCMessage()
|
||||
oscmsg.setAddress(oscaddress)
|
||||
oscmsg.append(oscargs)
|
||||
|
||||
#print ("sending to bhorosc : ",oscmsg)
|
||||
try:
|
||||
osclientlj.sendto(oscmsg, (redisIP, 8002))
|
||||
oscmsg.clearData()
|
||||
except:
|
||||
print ('Connection to LJ refused : died ?')
|
||||
pass
|
||||
#time.sleep(0.001
|
||||
|
||||
|
||||
|
||||
|
||||
ASCII_GRAPHICS = [
|
||||
|
||||
#implementé
|
||||
|
||||
[(-50,30), (-30,-30), (30,-30), (10,30), (-50,30)], #0
|
||||
[(-20,30), (0,-30), (-20,30)], #1
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #2
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #3
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #4
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #5
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #6
|
||||
[(-30,-30), (30,-30), (-30,30)], #7
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #8
|
||||
[(30,0), (-30,0), (-30,-10), (0,-30), (30,-30), (30,10), (0,30), (-30,30)], #9
|
||||
|
||||
# A implementer
|
||||
[(-30,10), (30,-10), (30,10), (0,30), (-30,10), (-30,-10), (0,-30), (30,-10)], #:
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #;
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #<
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #=
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #>
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #?
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #@
|
||||
|
||||
# Implementé
|
||||
|
||||
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #B
|
||||
[(30,30), (-30,30), (-30,-30), (30,-30)], #C
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #D
|
||||
[(30,30), (-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #E
|
||||
[(-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #F
|
||||
[(0,0), (30,0), (30,30), (-30,30), (-30,-30),(30,-30)], #G
|
||||
[(-30,-30), (-30,30), (-30,0), (30,0), (30,30), (30,-30)], #H
|
||||
[(0,30), (0,-30)], #I
|
||||
[(-30,30), (0,-30), (0,-30), (-30,-30), (30,-30)], #J
|
||||
[(-30,-30), (-30,30), (-30,0), (30,-30), (-30,0), (30,30)], #K
|
||||
[(30,30), (-30,30), (-30,-30)], #L
|
||||
[(-30,30), (-30,-30), (0,0), (30,-30), (30,30)], #M
|
||||
[(-30,30), (-30,-30), (30,30), (30,-30)], #N
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #O
|
||||
[(-30,0), (30,0), (30,-30), (-30,-30), (-30,30)], #P
|
||||
[(30,30), (30,-30), (-30,-30), (-30,30), (30,30),(35,35)], #Q
|
||||
[(-30,30), (-30,-30), (30,-30), (30,0), (-30,0), (30,30)], #R
|
||||
[(30,-30), (-30,-30), (-30,0), (30,0), (30,30), (-30,30)], #S
|
||||
[(0,30), (0,-30), (-30,-30), (30,-30)], #T
|
||||
[(-30,-30), (-30,30), (30,30), (30,-30)], #U
|
||||
[(-30,-30), (0,30), (30,-30)], #V
|
||||
[(-30,-30), (-30,30), (0,0), (30,30), (30,-30)], #W
|
||||
[(-30,30), (30,-30)], [(-30,-30), (30,30)], #X
|
||||
[(0,30), (0,0), (30,-30), (0,0), (-30,-30)], #Y
|
||||
[(30,30), (-30,30), (30,-30), (-30,-30)], #Z
|
||||
|
||||
# A implementer
|
||||
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #[
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #\
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #]
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #^
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #_
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #`
|
||||
|
||||
# Implementé
|
||||
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (20,0), (-20,0)], #a
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20), (-20,0), (20,0)], #b
|
||||
[(20,20), (-20,20), (-20,-20), (20,-20)], #c
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #d
|
||||
[(20,20), (-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #e
|
||||
[(-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #f
|
||||
[(0,0), (20,0), (20,20), (-20,20), (-20,-20),(20,-20)], #g
|
||||
[(-20,-20), (-20,20), (-20,0), (20,0), (20,20), (20,-20)], #H
|
||||
[(0,20), (0,-20)], #I
|
||||
[(-20,20), (0,-20), (0,-20), (-20,-20), (20,-20)], #J
|
||||
[(-20,-20), (-20,20), (-20,0), (20,-20), (-20,0), (20,20)], #K
|
||||
[(20,20), (-20,20), (-20,-20)], #L
|
||||
[(-20,20), (-20,-20), (0,0), (20,-20), (20,20)], #M
|
||||
[(-20,20), (-20,-20), (20,20), (20,-20)], #N
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #O
|
||||
[(-20,0), (20,0), (20,-20), (-20,-20), (-20,20)], #P
|
||||
[(20,20), (20,-20), (-20,-20), (-20,20), (20,20),(25,25)], #Q
|
||||
[(-20,20), (-20,-20), (20,-20), (20,0), (-20,0), (20,20)], #R
|
||||
[(20,-20), (-20,-20), (-20,0), (20,0), (20,20), (-20,20)], #S
|
||||
[(0,20), (0,-20), (-20,-20), (20,-20)], #T
|
||||
[(-20,-20), (-20,20), (20,20), (20,-20)], #U
|
||||
[(-20,-20), (0,20), (20,-20)], #V
|
||||
[(-20,-20), (-20,20), (0,0), (20,20), (20,-20)], #W
|
||||
[(-20,20), (20,-20)], [(-20,-20), (20,20)], #X
|
||||
[(0,20), (0,0), (20,-20), (0,0), (-20,-20)], #Y
|
||||
[(20,20), (-20,20), (20,-20), (-20,-20)], #Z
|
||||
|
||||
[(-2,15), (2,15)] # Point a la place de {
|
||||
]
|
||||
|
||||
def Config(redisIP,client):
|
||||
global ClientNumber
|
||||
|
||||
r = redis.StrictRedis(host=redisIP, port=6379, db=0)
|
||||
ClientNumber = client
|
||||
#print "client configured",ClientNumber
|
||||
|
||||
|
||||
def LineTo(xy, c, PL):
|
||||
|
||||
pl[PL].append((xy + (c,)))
|
||||
|
||||
def Line(xy1, xy2, c, PL):
|
||||
LineTo(xy1, 0, PL)
|
||||
LineTo(xy2, c , PL)
|
||||
|
||||
|
||||
def PolyLineOneColor(xy_list, c, PL , closed ):
|
||||
#print "--"
|
||||
#print "c",c
|
||||
#print "xy_list",xy_list
|
||||
#print "--"
|
||||
xy0 = None
|
||||
for xy in xy_list:
|
||||
if xy0 is None:
|
||||
xy0 = xy
|
||||
#print "xy0:",xy0
|
||||
LineTo(xy0,0, PL)
|
||||
LineTo(xy0,c, PL)
|
||||
else:
|
||||
#print "xy:",xy
|
||||
LineTo(xy,c, PL)
|
||||
if closed:
|
||||
LineTo(xy0,c, PL)
|
||||
|
||||
|
||||
# Computing points coordinates for rPolyline function from 3D and around 0,0 to pygame coordinates
|
||||
def Pointransf(xy, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0):
|
||||
|
||||
x = xy[0] * resize
|
||||
y = xy[1] * resize
|
||||
z = 0
|
||||
|
||||
rad = math.radians(rotx)
|
||||
cosaX = math.cos(rad)
|
||||
sinaX = math.sin(rad)
|
||||
|
||||
y2 = y
|
||||
y = y2 * cosaX - z * sinaX
|
||||
z = y2 * sinaX + z * cosaX
|
||||
|
||||
rad = math.radians(roty)
|
||||
cosaY = math.cos(rad)
|
||||
sinaY = math.sin(rad)
|
||||
|
||||
z2 = z
|
||||
z = z2 * cosaY - x * sinaY
|
||||
x = z2 * sinaY + x * cosaY
|
||||
|
||||
rad = math.radians(rotz)
|
||||
cosZ = math.cos(rad)
|
||||
sinZ = math.sin(rad)
|
||||
|
||||
x2 = x
|
||||
x = x2 * cosZ - y * sinZ
|
||||
y = x2 * sinZ + y * cosZ
|
||||
|
||||
#print xy, (x + xpos,y+ ypos)
|
||||
return (x + xpos,y+ ypos)
|
||||
'''
|
||||
to understand why it get negative Y
|
||||
|
||||
# 3D to 2D projection
|
||||
factor = 4 * gstt.cc[22] / ((gstt.cc[21] * 8) + z)
|
||||
print xy, (x * factor + xpos, - y * factor + ypos )
|
||||
return (x * factor + xpos, - y * factor + ypos )
|
||||
'''
|
||||
|
||||
# Send 2D point list around 0,0 with 3D rotation resizing and reposition around xpos ypos
|
||||
#def rPolyLineOneColor(self, xy_list, c, PL , closed, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0):
|
||||
def rPolyLineOneColor(xy_list, c, PL , closed, xpos = 0, ypos =0, resize =0.7, rotx =0, roty =0 , rotz=0):
|
||||
xy0 = None
|
||||
for xy in xy_list:
|
||||
if xy0 is None:
|
||||
xy0 = xy
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),0, PL)
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
else:
|
||||
LineTo(Pointransf(xy, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
if closed:
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
|
||||
|
||||
def LinesPL(PL):
|
||||
print "Stupido !! your code is to old : use DrawPL() instead of LinesPL()"
|
||||
DrawPL(PL)
|
||||
|
||||
def DrawPL(PL):
|
||||
#print '/pl/0/'+str(PL), str(pl[PL])
|
||||
if r.set('/pl/'+str(ClientNumber)+'/'+str(PL), str(pl[PL])) == True:
|
||||
#print '/pl/'+str(ClientNumber)+'/'+str(PL), str(pl[PL])
|
||||
pl[PL] = []
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def ResetPL(self, PL):
|
||||
pl[PL] = []
|
||||
|
||||
|
||||
|
||||
def DigitsDots(number,color):
|
||||
dots =[]
|
||||
for dot in ASCII_GRAPHICS[number]:
|
||||
#print dot
|
||||
dots.append((gstt.xy_center[0]+dot[0],gstt.xy_center[1]+dot[1],color))
|
||||
#self.point_list.append((xy + (c,)))
|
||||
return dots
|
||||
|
||||
def CharDots(char,color):
|
||||
|
||||
dots =[]
|
||||
for dot in ASCII_GRAPHICS[ord(char)-46]:
|
||||
dots.append((dot[0],dot[1],color))
|
||||
return dots
|
||||
|
||||
def Text(message,c, PL, xpos, ypos, resize, rotx, roty, rotz):
|
||||
|
||||
dots =[]
|
||||
|
||||
l = len(message)
|
||||
i= 0
|
||||
#print message
|
||||
|
||||
for ch in message:
|
||||
|
||||
#print ""
|
||||
# texte centre en x automatiquement selon le nombre de lettres l
|
||||
x_offset = 26 * (- (0.9*l) + 3*i)
|
||||
# Digits
|
||||
if ord(ch)<58:
|
||||
char_pl_list = ASCII_GRAPHICS[ord(ch) - 48]
|
||||
else:
|
||||
char_pl_list = ASCII_GRAPHICS[ord(ch) - 46]
|
||||
char_draw = []
|
||||
#dots.append((char_pl_list[0][0] + x_offset,char_pl_list[0][1],0))
|
||||
|
||||
for xy in char_pl_list:
|
||||
char_draw.append((xy[0] + x_offset,xy[1],c))
|
||||
i +=1
|
||||
#print ch,char_pl_list,char_draw
|
||||
rPolyLineOneColor(char_draw, c, PL , False, xpos, ypos, resize, rotx, roty, rotz)
|
||||
#dots.append(char_draw)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,367 +0,0 @@
|
|||
#!/usr/bin/python2.7
|
||||
# -*- coding: utf-8 -*-
|
||||
# -*- mode: Python -*-
|
||||
'''
|
||||
LJ Laser Pong v0.8
|
||||
|
||||
Sam Neurohack
|
||||
|
||||
'''
|
||||
|
||||
import pygame
|
||||
import math
|
||||
import itertools
|
||||
import sys
|
||||
import os
|
||||
|
||||
'''
|
||||
is_py2 = sys.version[0] == '2'
|
||||
if is_py2:
|
||||
from Queue import Queue
|
||||
else:
|
||||
from queue import Queue
|
||||
'''
|
||||
|
||||
import thread
|
||||
import time
|
||||
import random
|
||||
import lj
|
||||
import entities
|
||||
from controller import setup_controls
|
||||
import argparse
|
||||
|
||||
|
||||
score = None
|
||||
|
||||
screen_size = [800,600]
|
||||
|
||||
top_left = [200,100]
|
||||
bottom_left = [200,300]
|
||||
top_right = [600,100]
|
||||
bottom_right = [600,300]
|
||||
|
||||
score_pos = [550,40]
|
||||
score2_pos = [259,40]
|
||||
text_pos = [300,500,200]
|
||||
|
||||
ball_origin = [400,300,200]
|
||||
BALL_SPEED = 5
|
||||
BALL_SIZE_X = 3
|
||||
BALL_SIZE_Y = 3
|
||||
BALL_acc = 0.06
|
||||
|
||||
PADDLE_height = 100
|
||||
PADDLE_width = 10
|
||||
|
||||
FlipsSpeed = 7
|
||||
FLIPS_lorigin = [10,300,0]
|
||||
FLIPS_rorigin = [780,300,400]
|
||||
FlipsLx, FlipsLy = FLIPS_lorigin[0], FLIPS_lorigin[1]
|
||||
FlipsRx, FlipsRy = FLIPS_rorigin[0], FLIPS_rorigin[1]
|
||||
|
||||
|
||||
xy_center = [screen_size[0]/2,screen_size[1]/2]
|
||||
|
||||
GAME_FS_QUIT = -1
|
||||
GAME_FS_MENU = 0
|
||||
GAME_FS_PLAY = 1
|
||||
GAME_FS_GAMEOVER = 2
|
||||
GAME_FS_LAUNCH = 2
|
||||
|
||||
SCORE_ZOOM_PLAYING = 1.6
|
||||
SCORE_ZOOM_GAMEOVER = 5.0
|
||||
SCORE_DZOOM_PLAYING = -0.4
|
||||
SCORE_DZOOM_GAMEOVER = 0.1
|
||||
|
||||
Score1Zoom = SCORE_ZOOM_PLAYING
|
||||
|
||||
GRAVITY = 0.0001
|
||||
|
||||
fs = GAME_FS_MENU
|
||||
|
||||
def rgb2int(r,g,b):
|
||||
return int('0x%02x%02x%02x' % (r,g,b),0)
|
||||
|
||||
white = rgb2int(255,255,255)
|
||||
red = rgb2int(255,0,0)
|
||||
blue = rgb2int(0,0,255)
|
||||
green = rgb2int(0,255,0)
|
||||
|
||||
|
||||
print ("")
|
||||
print ("Arguments parsing if needed...")
|
||||
argsparser = argparse.ArgumentParser(description="Laserpong")
|
||||
|
||||
argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str)
|
||||
argsparser.add_argument("-c","--client",help="LJ client number (0 by default)",type=int)
|
||||
argsparser.add_argument("-l","--laser",help="Laser number to be displayed (0 by default)",type=int)
|
||||
|
||||
args = argsparser.parse_args()
|
||||
|
||||
|
||||
if args.client:
|
||||
ljclient = args.client
|
||||
else:
|
||||
ljclient = 0
|
||||
|
||||
if args.laser:
|
||||
plnumber = args.laser
|
||||
else:
|
||||
plnumber = 0
|
||||
|
||||
# Redis Computer IP
|
||||
if args.redisIP != None:
|
||||
redisIP = args.redisIP
|
||||
else:
|
||||
redisIP = '127.0.0.1'
|
||||
|
||||
lj.Config(redisIP,ljclient)
|
||||
|
||||
|
||||
def StartPlaying(first_time = False):
|
||||
global fs
|
||||
|
||||
lscore = 0
|
||||
rscore = 0
|
||||
fs = GAME_FS_LAUNCH
|
||||
x = ball_origin[0]
|
||||
y = ball_origin[1]
|
||||
|
||||
app_path = os.path.dirname(os.path.realpath(__file__))
|
||||
|
||||
pygame.init()
|
||||
#sounds.InitSounds()
|
||||
|
||||
clock = pygame.time.Clock()
|
||||
|
||||
Nbpads = pygame.joystick.get_count()
|
||||
print ("Joypads : ", str(Nbpads))
|
||||
|
||||
if Nbpads != 2:
|
||||
|
||||
print ('')
|
||||
print ('')
|
||||
print ("THIS VERSION NEEDS 2 PADS. PLEASE CONNECT THEM.")
|
||||
print ('')
|
||||
sys.exit()
|
||||
|
||||
|
||||
|
||||
if Nbpads > 1:
|
||||
|
||||
pad2 = pygame.joystick.Joystick(1)
|
||||
pad2.init()
|
||||
print "Pad2 :", pad2.get_name()
|
||||
numButtons = pad2.get_numbuttons()
|
||||
#print ("Axis Pad 2 :", str(pad2.get_numaxes()))
|
||||
#print ("Buttons Pad 2 :" , str(numButtons))
|
||||
|
||||
# joy is pad abstraction to handle many different devices.
|
||||
joy2 = setup_controls(pad2)
|
||||
|
||||
if Nbpads > 0:
|
||||
|
||||
pad1 = pygame.joystick.Joystick(0)
|
||||
pad1.init()
|
||||
print "Pad1 :",pad1.get_name()
|
||||
numButtons = pad1.get_numbuttons()
|
||||
joy1 = setup_controls(pad1)
|
||||
#print ("Axis Pad 1 :", str(pad1.get_numaxes()))
|
||||
#print ("Buttons Pad 1 :" , str(numButtons))
|
||||
|
||||
update_screen = False
|
||||
|
||||
xvel = - 1
|
||||
yvel = 0
|
||||
lscore = 0
|
||||
rscore = 0
|
||||
ly = FLIPS_lorigin[1]
|
||||
ry = FLIPS_rorigin[1]
|
||||
flipsy = [ly, ry]
|
||||
stick = 0
|
||||
x = ball_origin[0]
|
||||
y = ball_origin[1]
|
||||
|
||||
keystates = pygame.key.get_pressed()
|
||||
|
||||
|
||||
while fs != GAME_FS_QUIT:
|
||||
|
||||
|
||||
for event in pygame.event.get():
|
||||
if event.type == pygame.QUIT:
|
||||
fs = GAME_FS_QUIT
|
||||
|
||||
keystates_prev = keystates[:]
|
||||
keystates = pygame.key.get_pressed()[:]
|
||||
|
||||
|
||||
# Etats du jeu
|
||||
|
||||
if fs == GAME_FS_MENU:
|
||||
|
||||
if keystates[pygame.K_ESCAPE] and not keystates_prev[pygame.K_ESCAPE]:
|
||||
fs = GAME_FS_QUIT
|
||||
elif keystates[pygame.K_SPACE] and not keystates_prev[pygame.K_SPACE]:
|
||||
StartPlaying(True)
|
||||
lscore = 0
|
||||
rscore = 0
|
||||
|
||||
if joy1.getFire1() or joy2.getFire1():
|
||||
StartPlaying(False)
|
||||
lscore =0
|
||||
rscore = 0
|
||||
|
||||
|
||||
|
||||
elif fs == GAME_FS_PLAY:
|
||||
|
||||
if keystates[pygame.K_ESCAPE] and not keystates_prev[pygame.K_ESCAPE]:
|
||||
fs = GAME_FS_MENU
|
||||
|
||||
'''
|
||||
if Nbpads > 0:
|
||||
print "pad 1 :", joy1.getUp(), joy1.getDown(), joy1.getLeftTrigger(),joy1.getRightTrigger()
|
||||
print "pad 2 :", joy2.getUp(), joy2.getDown(), joy2.getLeftTrigger(),joy2.getRightTrigger()
|
||||
'''
|
||||
|
||||
# Lost ball / first to ten points ?
|
||||
#print " ball : " , x, y, " left : ", ly, " right : ", ry
|
||||
|
||||
if x < FLIPS_lorigin[0] + PADDLE_width:
|
||||
|
||||
print ("ball.y : ", y, " ly : ", ly)
|
||||
if y > (ly + PADDLE_height + 1) or y < (ly - BALL_SIZE_Y - 1):
|
||||
rscore += 1
|
||||
xvel = random.uniform(-1,-0.6)
|
||||
if rscore == 11:
|
||||
fs = GAME_FS_MENU
|
||||
else:
|
||||
fs = GAME_FS_LAUNCH
|
||||
else:
|
||||
x = FLIPS_lorigin[0] + PADDLE_width
|
||||
xvel *= -1
|
||||
|
||||
|
||||
if x > FLIPS_rorigin[0] - PADDLE_width:
|
||||
|
||||
print ("ball.y : ", y, " ry : ", ry)
|
||||
|
||||
if y < (ry - BALL_SIZE_Y - 1) or y > (ry + PADDLE_height + 1):
|
||||
lscore += 1
|
||||
xvel = random.uniform(1,0.6)
|
||||
if lscore == 11:
|
||||
fs = GAME_FS_MENU
|
||||
else:
|
||||
fs = GAME_FS_LAUNCH
|
||||
else:
|
||||
xvel *= -1
|
||||
x = FLIPS_rorigin[0] - PADDLE_width
|
||||
|
||||
# wall detect
|
||||
|
||||
if y < 0:
|
||||
y = 1
|
||||
yvel *= -1
|
||||
|
||||
if y > screen_size[1]:
|
||||
y = screen_size[1] - 1
|
||||
yvel *= -1
|
||||
|
||||
# Anim
|
||||
|
||||
x += BALL_SPEED * xvel
|
||||
y += BALL_SPEED * yvel
|
||||
yvel += GRAVITY
|
||||
entities.BallMove(x,y)
|
||||
|
||||
if Nbpads > 0:
|
||||
flipsy = entities.FlipsMove(joy1.getUp(),joy1.getDown(),joy2.getUp(),joy2.getDown())
|
||||
|
||||
else:
|
||||
flipsy = entities.FlipsMove(keystates[pygame.K_a],keystates[pygame.K_q],keystates[pygame.K_UP],keystates[pygame.K_DOWN])
|
||||
|
||||
ly = flipsy[0]
|
||||
ry = flipsy[1]
|
||||
|
||||
|
||||
|
||||
elif fs == GAME_FS_LAUNCH:
|
||||
|
||||
'''
|
||||
if Nbpads > 0:
|
||||
print "pad 1 :", joy1.getUp(), joy1.getDown(), joy1.getLeftTrigger(),joy1.getRightTrigger()
|
||||
print "pad 2 :", joy2.getUp(), joy2.getDown(), joy2.getLeftTrigger(),joy2.getRightTrigger()
|
||||
print pad1.get_axis(0),pad2.get_axis(0)
|
||||
'''
|
||||
|
||||
if keystates[pygame.K_ESCAPE] and not keystates_prev[pygame.K_ESCAPE]:
|
||||
fs = GAME_FS_MENU
|
||||
|
||||
if keystates[pygame.K_SPACE] and not keystates_prev[pygame.K_SPACE]:
|
||||
fs = GAME_FS_PLAY
|
||||
yvel = 0
|
||||
while math.fabs(xvel + yvel) < 1:
|
||||
#xvel = random.uniform(-1,1)
|
||||
yvel = random.uniform(-1,1)
|
||||
|
||||
if joy1.getFire1() or joy2.getFire1():
|
||||
fs = GAME_FS_PLAY
|
||||
yvel = 0
|
||||
while math.fabs(xvel + yvel) < 1:
|
||||
#xvel = random.uniform(-1,1)
|
||||
yvel = random.uniform(-1,1)
|
||||
|
||||
x = ball_origin[0]
|
||||
y = ball_origin[1]
|
||||
entities.BallMove(x,y)
|
||||
|
||||
if Nbpads > 0:
|
||||
flipsy = entities.FlipsMove(joy1.getUp(),joy1.getDown(),joy2.getUp(),joy2.getDown())
|
||||
|
||||
else:
|
||||
flipsy = entities.FlipsMove(keystates[pygame.K_a],keystates[pygame.K_q],keystates[pygame.K_UP],keystates[pygame.K_DOWN])
|
||||
ly = flipsy[0]
|
||||
ry = flipsy[1]
|
||||
|
||||
|
||||
|
||||
elif fs == GAME_FS_GAMEOVER:
|
||||
|
||||
#TODO : MODE GAME OVER, autres opérations d'animation
|
||||
# Remarque : on peut supprimer le mode GAME OVER et le gérer dans le mode jeu
|
||||
# si les traitements sont les mêmes
|
||||
'''
|
||||
if keystates[pygame.K_SPACE] and not keystates_prev[pygame.K_SPACE]:
|
||||
StartPlaying(False)
|
||||
'''
|
||||
|
||||
if joy1.getFire1() or joy2.getFire1():
|
||||
StartPlaying(False)
|
||||
|
||||
elif keystates[pygame.K_ESCAPE] and not keystates_prev[pygame.K_ESCAPE]:
|
||||
fs = GAME_FS_MENU
|
||||
# Peut-être aussi réinitialiser l'état dans le mode menu
|
||||
|
||||
|
||||
if fs == GAME_FS_PLAY or fs == GAME_FS_GAMEOVER or fs == GAME_FS_LAUNCH:
|
||||
|
||||
entities.Score1Draw(lscore)
|
||||
entities.Score2Draw(rscore)
|
||||
entities.FlipsDraw()
|
||||
entities.BallDraw()
|
||||
entities.FiletDraw()
|
||||
lj.DrawPL(0)
|
||||
|
||||
if fs == GAME_FS_MENU:
|
||||
|
||||
entities.LogoDraw()
|
||||
lj.DrawPL(0)
|
||||
|
||||
|
||||
# TODO : rendre indépendante la fréquence de rafraîchissement de l'écran par
|
||||
# rapport à celle de l'animation du jeu
|
||||
clock.tick(100)
|
||||
|
||||
pygame.quit()
|
||||
|
||||
|
|
@ -10,17 +10,25 @@ LICENCE : CC
|
|||
'''
|
||||
|
||||
import redis
|
||||
import lj
|
||||
import lj3
|
||||
import math
|
||||
import time
|
||||
import argparse
|
||||
|
||||
from osc4py3.as_eventloop import *
|
||||
from osc4py3 import oscbuildparse
|
||||
#from osc4py3 import oscmethod as osm
|
||||
from osc4py3.oscmethod import *
|
||||
|
||||
OSCinPort = 8004
|
||||
|
||||
print ("")
|
||||
print ("Arguments parsing if needed...")
|
||||
argsparser = argparse.ArgumentParser(description="Text Cycling for LJ")
|
||||
argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str)
|
||||
argsparser.add_argument("-c","--client",help="LJ client number (0 by default)",type=int)
|
||||
argsparser.add_argument("-l","--laser",help="Laser number to be displayed (0 by default)",type=int)
|
||||
argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",type=int)
|
||||
|
||||
args = argsparser.parse_args()
|
||||
|
||||
|
|
@ -41,7 +49,14 @@ if args.redisIP != None:
|
|||
else:
|
||||
redisIP = '127.0.0.1'
|
||||
|
||||
lj.Config(redisIP,ljclient)
|
||||
|
||||
if args.verbose:
|
||||
debug = args.verbose
|
||||
else:
|
||||
debug = 0
|
||||
|
||||
|
||||
lj3.Config(redisIP,ljclient)
|
||||
|
||||
|
||||
width = 800
|
||||
|
|
@ -94,6 +109,13 @@ def rgb2int(r,g,b):
|
|||
return int('0x%02x%02x%02x' % (r,g,b),0)
|
||||
|
||||
|
||||
def OSCljclient(value):
|
||||
# Will receive message address, and message data flattened in s, x, y
|
||||
print("I got /glyph/ljclient with value", value)
|
||||
ljclient = value
|
||||
lj3.LjClient(ljclient)
|
||||
|
||||
|
||||
def Proj(x,y,z,angleX,angleY,angleZ):
|
||||
|
||||
rad = angleX * math.pi / 180
|
||||
|
|
@ -130,58 +152,82 @@ def Run():
|
|||
Left = []
|
||||
Right = []
|
||||
counter =0
|
||||
WebStatus("LaserGlyph")
|
||||
|
||||
while 1:
|
||||
# OSC Server callbacks
|
||||
print("Starting OSC at 127.0.0.1 port",OSCinPort,"...")
|
||||
osc_startup()
|
||||
osc_udp_server("127.0.0.1", OSCinPort, "InPort")
|
||||
osc_method("/ping*", lj3.OSCping)
|
||||
osc_method("/glyph/ljclient", OSCljclient)
|
||||
|
||||
Left = []
|
||||
Right = []
|
||||
try:
|
||||
|
||||
x = vertices[0][0]
|
||||
y = vertices[0][1]
|
||||
z = vertices[0][2]
|
||||
while 1:
|
||||
Left = []
|
||||
Right = []
|
||||
|
||||
x = vertices[0][0]
|
||||
y = vertices[0][1]
|
||||
z = vertices[0][2]
|
||||
|
||||
# The cube start always with vertice 0
|
||||
# LJ tracers will "move" the laser to this first point in black, then move to the next with second point color.
|
||||
# For more accuracy in dac emulator, repeat this first point.
|
||||
|
||||
# Cube Y axis rotation of 'counter' angle and 3d-2d Proj function.
|
||||
#Left.append( Proj(x+LeftShift(z*5),y,z,0,counter,0))
|
||||
#Right.append(Proj(x+RightShift(z*5),y,z,0,counter,0))
|
||||
|
||||
|
||||
# Add all the cube points face by face.
|
||||
for fa in faces:
|
||||
for point in fa:
|
||||
x = vertices[point][0]
|
||||
y = vertices[point][1]
|
||||
z = vertices[point][2]
|
||||
|
||||
Left.append(Proj(x+LeftShift(z*25),y,z,0,counter,0))
|
||||
Right.append(Proj(x+RightShift(z*25),y,z,0,counter,0))
|
||||
|
||||
|
||||
# Drawing step, 2 possibilities
|
||||
|
||||
# Red and Green drawn by laser 0
|
||||
lj3.PolyLineOneColor(Left, c = red, PL = 0, closed = True)
|
||||
lj3.PolyLineOneColor(Right, c = green, PL = 0, closed = True)
|
||||
lj3.DrawPL(0)
|
||||
|
||||
'''
|
||||
# Red on laser 1 and green on laser 2
|
||||
lj3.PolyLineOneColor(Left, c = red, PL = 1, closed = True)
|
||||
lj3.PolyLineOneColor(Right, c = green, PL = 2, closed = True)
|
||||
lj3.DrawPL(1)
|
||||
lj3.DrawPL(2)
|
||||
|
||||
'''
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
counter += 1
|
||||
if counter >360:
|
||||
counter =0
|
||||
|
||||
# The cube start always with vertice 0
|
||||
# LJ tracers will "move" the laser to this first point in black, then move to the next with second point color.
|
||||
# For more accuracy in dac emulator, repeat this first point.
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
# Cube Y axis rotation of 'counter' angle and 3d-2d Proj function.
|
||||
#Left.append( Proj(x+LeftShift(z*5),y,z,0,counter,0))
|
||||
#Right.append(Proj(x+RightShift(z*5),y,z,0,counter,0))
|
||||
# Gently stop on CTRL C
|
||||
|
||||
finally:
|
||||
|
||||
# Add all the cube points face by face.
|
||||
for fa in faces:
|
||||
for point in fa:
|
||||
x = vertices[point][0]
|
||||
y = vertices[point][1]
|
||||
z = vertices[point][2]
|
||||
WebStatus("Glyph Exit")
|
||||
print("Stopping OSC...")
|
||||
lj3.OSCstop()
|
||||
pass
|
||||
|
||||
Left.append( Proj(x+LeftShift(z*25),y,z,0,counter,0))
|
||||
Right.append(Proj(x+RightShift(z*25),y,z,0,counter,0))
|
||||
print ("LaserGlyph Stopped.")
|
||||
|
||||
|
||||
# Drawing step, 2 possibilities
|
||||
|
||||
# Red and Green drawn by laser 0
|
||||
lj.PolyLineOneColor(Left, c = red, PL = 0, closed = True)
|
||||
lj.PolyLineOneColor(Right, c = green, PL = 0, closed = True)
|
||||
lj.DrawPL(0)
|
||||
|
||||
'''
|
||||
# Red on laser 1 and green on laser 2
|
||||
lj.PolyLineOneColor(Left, c = red, PL = 1, closed = True)
|
||||
lj.PolyLineOneColor(Right, c = green, PL = 2, closed = True)
|
||||
lj.DrawPL(1)
|
||||
lj.DrawPL(2)
|
||||
|
||||
'''
|
||||
|
||||
time.sleep(0.1)
|
||||
|
||||
counter += 1
|
||||
if counter >360:
|
||||
counter =0
|
||||
|
||||
white = rgb2int(255,255,255)
|
||||
red = rgb2int(255,0,0)
|
||||
blue = rgb2int(0,0,255)
|
||||
|
|
|
|||
|
|
@ -1,45 +0,0 @@
|
|||
Multi Laser planetarium in python3 for LJ.
|
||||
v0.01
|
||||
Sam Neurohack
|
||||
|
||||
Make sure to understand altitude/azimuth coordinate system.
|
||||
|
||||
|
||||
Display all solar planets and hipparcos catalog objects below a given magnitude. Accuracy tested against apparent data and starchart at https://www.calsky.com/cs.cgi?cha=7&sec=3&sub=2
|
||||
|
||||
It's an alpha release so a little hardcoded :
|
||||
|
||||
- set observer position (find SkyCity, SkyCountryCode) in main.py like 'Paris' and 'FR'
|
||||
- set observer date/time in InitObserver() arguments (default is now in UTC)
|
||||
- set what sky part you want to display for each laser in 'LaserSkies' variable : Define alitude and azimuth for top left and bottom right of each laser.
|
||||
|
||||
It needs more libraries than plan. Currently it relies on the awesome astropy, skyfield,...
|
||||
|
||||
Soon some pictures.
|
||||
|
||||
To Run :
|
||||
|
||||
Launch LJ first
|
||||
python3 main.py
|
||||
|
||||
For debug options and more type : python3 --help
|
||||
|
||||
|
||||
To install :
|
||||
|
||||
Install LJ first.
|
||||
go3.sh install required python3 modules
|
||||
|
||||
NB :
|
||||
- if you get an year error out of range : install the last skyfield "python-skyfield" in github.
|
||||
- Read main.py
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
LICENCE : CC
|
||||
Remember : LJ will automatically warp geometry according to alignement data before sending to lasers. See webUI.
|
||||
'''
|
||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,9 +0,0 @@
|
|||
sudo apt install python3-pip
|
||||
pip3 install jplephem
|
||||
pip3 install pyephem
|
||||
pip3 install astropy
|
||||
pip3 install skyfield
|
||||
pip3 install pandas
|
||||
pip3 install redis
|
||||
pip3 install osc4py3
|
||||
pip3 install --pre astroquery
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
Acamar, 13847
|
||||
Groombridge 1830, 57939
|
||||
Achernar, 7588
|
||||
Hadar, 68702
|
||||
Acrux, 60718
|
||||
Hamal, 9884
|
||||
Adhara, 33579
|
||||
Izar, 72105
|
||||
Agena, 68702
|
||||
Kapteyn's star, 24186
|
||||
Albireo, 95947
|
||||
Kaus Australis, 90185
|
||||
Alcor, 65477
|
||||
Kocab, 72607
|
||||
Alcyone, 17702
|
||||
Kruger,60, 110893
|
||||
Aldebaran, 21421
|
||||
Luyten's star, 36208
|
||||
Alderamin, 105199
|
||||
Markab, 113963
|
||||
Algenib, 1067
|
||||
Megrez, 59774
|
||||
Algieba, 50583
|
||||
Menkar, 14135
|
||||
Algol, 14576
|
||||
Merak, 53910
|
||||
Alhena, 31681
|
||||
Mintaka, 25930
|
||||
Alioth, 62956
|
||||
Mira, 10826
|
||||
Alkaid, 67301
|
||||
Mirach, 5447
|
||||
Almaak, 9640
|
||||
Mirphak, 15863
|
||||
Alnair, 109268
|
||||
Mizar, 65378
|
||||
Alnath, 25428
|
||||
Nihal, 25606
|
||||
Alnilam, 26311
|
||||
Nunki, 92855
|
||||
Alnitak, 26727
|
||||
Phad, 58001
|
||||
Alphard, 46390
|
||||
Pleione, 17851
|
||||
Alphekka, 76267
|
||||
Polaris, 11767
|
||||
Alpheratz, 677
|
||||
Pollux, 37826
|
||||
Alshain, 98036
|
||||
Procyon, 37279
|
||||
Altair, 97649
|
||||
Proxima, 70890
|
||||
Ankaa, 2081
|
||||
Rasalgethi, 84345
|
||||
Antares, 80763
|
||||
Rasalhague, 86032
|
||||
Arcturus, 69673
|
||||
Red,Rectangle, 30089
|
||||
Arneb, 25985,
|
||||
Regulus, 49669
|
||||
Babcock's star, 112247
|
||||
Rigel, 24436
|
||||
Barnard's,star, 87937
|
||||
Rigil Kent, 71683
|
||||
Bellatrix, 25336
|
||||
Sadalmelik, 109074
|
||||
Betelgeuse, 27989
|
||||
Saiph, 27366
|
||||
Campbell's star, 96295
|
||||
Scheat, 113881
|
||||
Canopus, 30438
|
||||
Shaula, 85927
|
||||
Capella, 24608
|
||||
Shedir, 3179
|
||||
Caph, 746
|
||||
Sheliak, 92420
|
||||
Castor, 36850
|
||||
Sirius, 32349
|
||||
Cor Caroli, 63125
|
||||
Spica, 65474
|
||||
Cyg X-1, 98298
|
||||
Tarazed, 97278
|
||||
Deneb, 102098
|
||||
Thuban, 68756
|
||||
Denebola, 57632
|
||||
Unukalhai, 77070
|
||||
Diphda, 3419
|
||||
Van,Maanen 2, 3829
|
||||
Dubhe, 54061
|
||||
Vega, 91262
|
||||
Enif, 107315
|
||||
Vindemiatrix, 63608
|
||||
Etamin, 87833
|
||||
Zaurak, 18543
|
||||
Fomalhaut, 113368
|
||||
3C 273, 60936
|
||||
|
|
@ -1,337 +0,0 @@
|
|||
# coding=UTF-8
|
||||
|
||||
'''
|
||||
LJ v0.8.1 in python3
|
||||
Some LJ functions useful for python clients (was framy.py)
|
||||
|
||||
OSC functions commented, waiting working on OSC in python3
|
||||
|
||||
Config(redisIP, client number)
|
||||
PolyLineOneColor
|
||||
rPolyLineOneColor
|
||||
|
||||
Text(word, color, PL, xpos, ypos, resize, rotx, roty, rotz) : Display a word
|
||||
Send(adress,message) : remote control. See commands.py
|
||||
WebStatus(message) : display message on webui
|
||||
DrawPL(point list number) : once you stacked all wanted elements, like 2 polylines, send them to lasers.
|
||||
|
||||
LICENCE : CC
|
||||
Sam Neurohack
|
||||
|
||||
'''
|
||||
|
||||
import math
|
||||
import redis
|
||||
|
||||
# Import needed modules from osc4py3
|
||||
from osc4py3.as_eventloop import *
|
||||
from osc4py3 import oscbuildparse
|
||||
|
||||
|
||||
redisIP = '127.0.0.1'
|
||||
r = redis.StrictRedis(host=redisIP, port=6379, db=0)
|
||||
|
||||
ClientNumber = 0
|
||||
|
||||
point_list = []
|
||||
pl = [[],[],[],[]]
|
||||
|
||||
#
|
||||
# OSC interaction with LJ
|
||||
#
|
||||
|
||||
def OSCstart():
|
||||
# Start the system.
|
||||
osc_startup()
|
||||
#osc_udp_client(redisIP, 8002, "LJ 8002")
|
||||
|
||||
def OSCframe():
|
||||
#print("OSCprocess")
|
||||
osc_process()
|
||||
|
||||
# Properly close the system. Todo
|
||||
def OSCstop():
|
||||
osc_terminate()
|
||||
|
||||
|
||||
def Send(oscaddress,oscargs=''):
|
||||
|
||||
try:
|
||||
msg = oscbuildparse.OSCMessage(oscaddress, None, [oscargs])
|
||||
osc_send(msg, "LJ 8002")
|
||||
OSCframe()
|
||||
|
||||
except:
|
||||
print ('Connection to LJ refused : died ?')
|
||||
pass
|
||||
'''
|
||||
def handlerfunction(s, x, y):
|
||||
# Will receive message data unpacked in s, x, y
|
||||
pass
|
||||
|
||||
def handlerfunction2(address, s, x, y):
|
||||
# Will receive message address, and message data flattened in s, x, y
|
||||
pass
|
||||
|
||||
# Make server channels to receive packets.
|
||||
osc_udp_server("127.0.0.1", 3721, "localhost")
|
||||
osc_udp_server("0.0.0.0", 3724, "anotherserver")
|
||||
'''
|
||||
|
||||
|
||||
|
||||
ASCII_GRAPHICS = [
|
||||
|
||||
# caracteres corrects
|
||||
|
||||
[(-50,30), (-30,-30), (30,-30), (10,30), (-50,30)], #0
|
||||
[(-20,30), (0,-30), (-20,30)], #1
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #2
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #3
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #4
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #5
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #6
|
||||
[(-30,-30), (30,-30), (-30,30)], #7
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #8
|
||||
[(30,0), (-30,0), (-30,-10), (0,-30), (30,-30), (30,10), (0,30), (-30,30)], #9
|
||||
|
||||
# caracteres a implementer
|
||||
[(-30,10), (30,-10), (30,10), (0,30), (-30,10), (-30,-10), (0,-30), (30,-10)], #:
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #;
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #<
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #=
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #>
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #?
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #@
|
||||
|
||||
# Caracteres corrects
|
||||
|
||||
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (30,0), (-30,0)], #A
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30), (-30,0), (30,0)], #B
|
||||
[(30,30), (-30,30), (-30,-30), (30,-30)], #C
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #D
|
||||
[(30,30), (-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #E
|
||||
[(-30,30), (-30,-0), (30,0), (-30,0), (-30,-30), (30,-30)], #F
|
||||
[(0,0), (30,0), (30,30), (-30,30), (-30,-30),(30,-30)], #G
|
||||
[(-30,-30), (-30,30), (-30,0), (30,0), (30,30), (30,-30)], #H
|
||||
[(0,30), (0,-30)], #I
|
||||
[(-30,30), (0,-30), (0,-30), (-30,-30), (30,-30)], #J
|
||||
[(-30,-30), (-30,30), (-30,0), (30,-30), (-30,0), (30,30)], #K
|
||||
[(30,30), (-30,30), (-30,-30)], #L
|
||||
[(-30,30), (-30,-30), (0,0), (30,-30), (30,30)], #M
|
||||
[(-30,30), (-30,-30), (30,30), (30,-30)], #N
|
||||
[(-30,30), (-30,-30), (30,-30), (30,30), (-30,30)], #O
|
||||
[(-30,0), (30,0), (30,-30), (-30,-30), (-30,30)], #P
|
||||
[(30,30), (30,-30), (-30,-30), (-30,30), (30,30),(35,35)], #Q
|
||||
[(-30,30), (-30,-30), (30,-30), (30,0), (-30,0), (30,30)], #R
|
||||
[(30,-30), (-30,-30), (-30,0), (30,0), (30,30), (-30,30)], #S
|
||||
[(0,30), (0,-30), (-30,-30), (30,-30)], #T
|
||||
[(-30,-30), (-30,30), (30,30), (30,-30)], #U
|
||||
[(-30,-30), (0,30), (30,-30)], #V
|
||||
[(-30,-30), (-30,30), (0,0), (30,30), (30,-30)], #W
|
||||
[(-30,30), (30,-30)], [(-30,-30), (30,30)], #X
|
||||
[(0,30), (0,0), (30,-30), (0,0), (-30,-30)], #Y
|
||||
[(30,30), (-30,30), (30,-30), (-30,-30)], #Z
|
||||
|
||||
# A implementer
|
||||
|
||||
[(-30,-10), (0,-30), (0,30)], [(-30,30), (30,30)], #[
|
||||
[(-30,-10), (0,-30), (30,-10), (30,0), (-30,30), (30,30)], #\
|
||||
[(-30,-30), (0,-30), (30,-10), (0,0), (30,10), (0,30), (-30,30)], #]
|
||||
[(30,10), (-30,10), (0,-30), (0,30)], #^
|
||||
[(30,-30), (-30,-30), (-30,0), (0,0), (30,10), (0,30), (-30,30)], #_
|
||||
[(30,-30), (0,-30), (-30,-10), (-30,30), (0,30), (30,10), (30,0), (-30,0)], #`
|
||||
|
||||
# Implementé
|
||||
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (20,0), (-20,0)], #a
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20), (-20,0), (20,0)], #b
|
||||
[(20,20), (-20,20), (-20,-20), (20,-20)], #c
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #d
|
||||
[(20,20), (-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #e
|
||||
[(-20,20), (-20,-0), (20,0), (-20,0), (-20,-20), (20,-20)], #f
|
||||
[(0,0), (20,0), (20,20), (-20,20), (-20,-20),(20,-20)], #g
|
||||
[(-20,-20), (-20,20), (-20,0), (20,0), (20,20), (20,-20)], #H
|
||||
[(0,20), (0,-20)], #I
|
||||
[(-20,20), (0,-20), (0,-20), (-20,-20), (20,-20)], #J
|
||||
[(-20,-20), (-20,20), (-20,0), (20,-20), (-20,0), (20,20)], #K
|
||||
[(20,20), (-20,20), (-20,-20)], #L
|
||||
[(-20,20), (-20,-20), (0,0), (20,-20), (20,20)], #M
|
||||
[(-20,20), (-20,-20), (20,20), (20,-20)], #N
|
||||
[(-20,20), (-20,-20), (20,-20), (20,20), (-20,20)], #O
|
||||
[(-20,0), (20,0), (20,-20), (-20,-20), (-20,20)], #P
|
||||
[(20,20), (20,-20), (-20,-20), (-20,20), (20,20),(25,25)], #Q
|
||||
[(-20,20), (-20,-20), (20,-20), (20,0), (-20,0), (20,20)], #R
|
||||
[(20,-20), (-20,-20), (-20,0), (20,0), (20,20), (-20,20)], #S
|
||||
[(0,20), (0,-20), (-20,-20), (20,-20)], #T
|
||||
[(-20,-20), (-20,20), (20,20), (20,-20)], #U
|
||||
[(-20,-20), (0,20), (20,-20)], #V
|
||||
[(-20,-20), (-20,20), (0,0), (20,20), (20,-20)], #W
|
||||
[(-20,20), (20,-20)], [(-20,-20), (20,20)], #X
|
||||
[(0,20), (0,0), (20,-20), (0,0), (-20,-20)], #Y
|
||||
[(20,20), (-20,20), (20,-20), (-20,-20)], #Z
|
||||
|
||||
[(-2,15), (2,15)] # Point a la place de {
|
||||
]
|
||||
|
||||
def Config(redisIP,client):
|
||||
global ClientNumber
|
||||
|
||||
r = redis.StrictRedis(host=redisIP, port=6379, db=0)
|
||||
ClientNumber = client
|
||||
osc_udp_client(redisIP, 8002, "LJ 8002")
|
||||
|
||||
|
||||
def LineTo(xy, c, PL):
|
||||
|
||||
pl[PL].append((xy + (c,)))
|
||||
|
||||
def Line(xy1, xy2, c, PL):
|
||||
LineTo(xy1, 0, PL)
|
||||
LineTo(xy2, c , PL)
|
||||
|
||||
|
||||
def PolyLineOneColor(xy_list, c, PL , closed ):
|
||||
#print "--"
|
||||
#print "c",c
|
||||
#print "xy_list",xy_list
|
||||
#print "--"
|
||||
xy0 = None
|
||||
for xy in xy_list:
|
||||
if xy0 is None:
|
||||
xy0 = xy
|
||||
#print "xy0:",xy0
|
||||
LineTo(xy0,0, PL)
|
||||
LineTo(xy0,c, PL)
|
||||
else:
|
||||
#print "xy:",xy
|
||||
LineTo(xy,c, PL)
|
||||
if closed:
|
||||
LineTo(xy0,c, PL)
|
||||
|
||||
|
||||
# Computing points coordinates for rPolyline function from 3D and around 0,0 to pygame coordinates
|
||||
def Pointransf(xy, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0):
|
||||
|
||||
x = xy[0] * resize
|
||||
y = xy[1] * resize
|
||||
z = 0
|
||||
|
||||
rad = rotx * math.pi / 180
|
||||
cosaX = math.cos(rad)
|
||||
sinaX = math.sin(rad)
|
||||
|
||||
y2 = y
|
||||
y = y2 * cosaX - z * sinaX
|
||||
z = y2 * sinaX + z * cosaX
|
||||
|
||||
rad = roty * math.pi / 180
|
||||
cosaY = math.cos(rad)
|
||||
sinaY = math.sin(rad)
|
||||
|
||||
z2 = z
|
||||
z = z2 * cosaY - x * sinaY
|
||||
x = z2 * sinaY + x * cosaY
|
||||
|
||||
rad = rotz * math.pi / 180
|
||||
cosZ = math.cos(rad)
|
||||
sinZ = math.sin(rad)
|
||||
|
||||
x2 = x
|
||||
x = x2 * cosZ - y * sinZ
|
||||
y = x2 * sinZ + y * cosZ
|
||||
|
||||
#print xy, (x + xpos,y+ ypos)
|
||||
return (x + xpos,y+ ypos)
|
||||
'''
|
||||
to understand why it get negative Y
|
||||
|
||||
# 3D to 2D projection
|
||||
factor = 4 * gstt.cc[22] / ((gstt.cc[21] * 8) + z)
|
||||
print xy, (x * factor + xpos, - y * factor + ypos )
|
||||
return (x * factor + xpos, - y * factor + ypos )
|
||||
'''
|
||||
|
||||
# Send 2D point list around 0,0 with 3D rotation resizing and reposition around xpos ypos
|
||||
#def rPolyLineOneColor(self, xy_list, c, PL , closed, xpos = 0, ypos =0, resize =1, rotx =0, roty =0 , rotz=0):
|
||||
def rPolyLineOneColor(xy_list, c, PL , closed, xpos = 0, ypos =0, resize =0.7, rotx =0, roty =0 , rotz=0):
|
||||
xy0 = None
|
||||
for xy in xy_list:
|
||||
if xy0 is None:
|
||||
xy0 = xy
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),0, PL)
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
else:
|
||||
LineTo(Pointransf(xy, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
if closed:
|
||||
LineTo(Pointransf(xy0, xpos, ypos, resize, rotx, roty, rotz),c, PL)
|
||||
|
||||
|
||||
def LinesPL(PL):
|
||||
print ("Stupido !! your code is to old : use DrawPL() instead of LinesPL()")
|
||||
DrawPL(PL)
|
||||
|
||||
def DrawPL(PL):
|
||||
#print '/pl/0/'+str(PL), str(pl[PL])
|
||||
if r.set('/pl/'+str(ClientNumber)+'/'+str(PL), str(pl[PL])) == True:
|
||||
pl[PL] = []
|
||||
return True
|
||||
else:
|
||||
return False
|
||||
|
||||
def ResetPL(self, PL):
|
||||
pl[PL] = []
|
||||
|
||||
|
||||
|
||||
def DigitsDots(number,color):
|
||||
dots =[]
|
||||
for dot in ASCII_GRAPHICS[number]:
|
||||
#print dot
|
||||
dots.append((gstt.xy_center[0]+dot[0],gstt.xy_center[1]+dot[1],color))
|
||||
#self.point_list.append((xy + (c,)))
|
||||
return dots
|
||||
|
||||
def CharDots(char,color):
|
||||
|
||||
dots =[]
|
||||
for dot in ASCII_GRAPHICS[ord(char)-46]:
|
||||
dots.append((dot[0],dot[1],color))
|
||||
return dots
|
||||
|
||||
def Text(message,c, PL, xpos, ypos, resize, rotx, roty, rotz):
|
||||
|
||||
dots =[]
|
||||
|
||||
l = len(message)
|
||||
i= 0
|
||||
#print message
|
||||
|
||||
for ch in message:
|
||||
|
||||
#print ""
|
||||
# texte centre en x automatiquement selon le nombre de lettres l
|
||||
x_offset = 26 * (- (0.9*l) + 3*i)
|
||||
#print i,x_offset
|
||||
# if digit
|
||||
if ord(ch)<58:
|
||||
char_pl_list = ASCII_GRAPHICS[ord(ch) - 48]
|
||||
else:
|
||||
char_pl_list = ASCII_GRAPHICS[ord(ch) - 46 ]
|
||||
|
||||
char_draw = []
|
||||
#dots.append((char_pl_list[0][0] + x_offset,char_pl_list[0][1],0))
|
||||
|
||||
for xy in char_pl_list:
|
||||
char_draw.append((xy[0] + x_offset,xy[1],c))
|
||||
i +=1
|
||||
#print ch,char_pl_list,char_draw
|
||||
rPolyLineOneColor(char_draw, c, PL , False, xpos, ypos, resize, rotx, roty, rotz)
|
||||
#print ("laser",PL,"message",message)
|
||||
#dots.append(char_draw)
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,693 +0,0 @@
|
|||
#!/usr/bin/python3
|
||||
# coding=UTF-8
|
||||
|
||||
'''
|
||||
Multi Laser planetarium in python3 for LJ.
|
||||
v0.01
|
||||
Sam Neurohack
|
||||
|
||||
Accuracy could be tested against apparent data and starchart at https://www.calsky.com/cs.cgi?cha=7&sec=3&sub=2
|
||||
Remember to set the same observer position and time.
|
||||
|
||||
See Readme for more information
|
||||
|
||||
|
||||
Todo:
|
||||
|
||||
- use debug mode and check altaz calculated values against online sites.
|
||||
- Validate aa2radec() with online calculator. Rewrite it to remove need for Astropy.
|
||||
- Findout how to use OSC in python 3.
|
||||
-
|
||||
- Code WebUI page.
|
||||
- UpdateStars() in each laser sky. Get magnitude. See UpdateSolar for example.
|
||||
- All Draw operations should also check visibility in the given laser altitude range.
|
||||
- Rewrite CityPosition() with proper search in a python dictionnary.
|
||||
- Better python code. Better varuable to understand easily Update() methods.
|
||||
|
||||
LICENCE : CC
|
||||
Remember : LJ will automatically warp geometry according to alignement data. See webUI.
|
||||
'''
|
||||
|
||||
import redis
|
||||
import lj3
|
||||
import numpy as np
|
||||
import math,time
|
||||
|
||||
from astropy.coordinates import SkyCoord, EarthLocation, AltAz
|
||||
from astropy import units as u
|
||||
from astropy.time import Time
|
||||
|
||||
from skyfield.api import Star, load, Topos,Angle
|
||||
from skyfield.data import hipparcos
|
||||
|
||||
from osc4py3.as_eventloop import *
|
||||
from osc4py3 import oscbuildparse
|
||||
#from osc4py3 import oscmethod as osm
|
||||
from osc4py3.oscmethod import *
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
import json
|
||||
|
||||
'''
|
||||
is_py2 = sys.version[0] == '2'
|
||||
if is_py2:
|
||||
from Queue import Queue
|
||||
else:
|
||||
from queue import Queue
|
||||
'''
|
||||
|
||||
#
|
||||
# Arguments handler
|
||||
#
|
||||
|
||||
import argparse
|
||||
|
||||
|
||||
|
||||
print ("")
|
||||
print ("Arguments parsing if needed...")
|
||||
argsparser = argparse.ArgumentParser(description="Planetarium for LJ")
|
||||
argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str)
|
||||
argsparser.add_argument("-c","--client",help="LJ client number (0 by default)",type=int)
|
||||
argsparser.add_argument("-L","--Lasers",help="Number of lasers connected (1 by default).",type=int)
|
||||
argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",type=int)
|
||||
argsparser.add_argument("-i","--input",help="inputs OSC Port (8005 by default)",type=int)
|
||||
#argsparser.add_argument("-n","--name",help="City Name of the observer",type=str)
|
||||
#argsparser.add_argument("-r","--redisIP",help="Country code of the observer ",type=str)
|
||||
|
||||
args = argsparser.parse_args()
|
||||
|
||||
|
||||
if args.client:
|
||||
ljclient = args.client
|
||||
else:
|
||||
ljclient = 0
|
||||
|
||||
if args.Lasers:
|
||||
lasernumber = args.Lasers
|
||||
else:
|
||||
lasernumber = 1
|
||||
|
||||
if args.verbose:
|
||||
debug = args.verbose
|
||||
else:
|
||||
debug = 0
|
||||
|
||||
if args.input:
|
||||
OSCinPort = args.input
|
||||
else:
|
||||
OSCinPort = 8005
|
||||
|
||||
# Redis Computer IP
|
||||
if args.redisIP != None:
|
||||
redisIP = args.redisIP
|
||||
else:
|
||||
redisIP = '127.0.0.1'
|
||||
|
||||
lj3.Config(redisIP,ljclient)
|
||||
|
||||
#
|
||||
# Inits Laser
|
||||
#
|
||||
|
||||
fov = 256
|
||||
viewer_distance = 2.2
|
||||
width = 750
|
||||
height = 750
|
||||
centerX = width / 2
|
||||
centerY = height / 2
|
||||
|
||||
samparray = [0] * 100
|
||||
|
||||
|
||||
# If you want to use rgb for color :
|
||||
def rgb2int(r,g,b):
|
||||
return int('0x%02x%02x%02x' % (r,g,b),0)
|
||||
|
||||
white = rgb2int(255,255,255)
|
||||
red = rgb2int(255,0,0)
|
||||
blue = rgb2int(0,0,255)
|
||||
green = rgb2int(0,255,0)
|
||||
|
||||
|
||||
|
||||
def Proj(x,y,z,angleX,angleY,angleZ):
|
||||
|
||||
rad = angleX * math.pi / 180
|
||||
cosa = math.cos(rad)
|
||||
sina = math.sin(rad)
|
||||
y2 = y
|
||||
y = y2 * cosa - z * sina
|
||||
z = y2 * sina + z * cosa
|
||||
|
||||
rad = angleY * math.pi / 180
|
||||
cosa = math.cos(rad)
|
||||
sina = math.sin(rad)
|
||||
z2 = z
|
||||
z = z2 * cosa - x * sina
|
||||
x = z2 * sina + x * cosa
|
||||
|
||||
rad = angleZ * math.pi / 180
|
||||
cosa = math.cos(rad)
|
||||
sina = math.sin(rad)
|
||||
x2 = x
|
||||
x = x2 * cosa - y * sina
|
||||
y = x2 * sina + y * cosa
|
||||
|
||||
|
||||
""" Transforms this 3D point to 2D using a perspective projection. """
|
||||
factor = fov / (viewer_distance + z)
|
||||
x = x * factor + centerX
|
||||
y = - y * factor + centerY
|
||||
return (x,y)
|
||||
|
||||
#
|
||||
# All the coordinates base functions
|
||||
#
|
||||
|
||||
'''
|
||||
To minize number of sky objects coordinates conversion : Change planetarium FOV in Ra Dec to select objects
|
||||
(planets, hipparcos,..). Then get only those objects in AltAz coordinates.
|
||||
aa2radec use Astropy to compute Equatorial Right Ascension and Declinaison coordinates from given observator Altitude and Azimuth.
|
||||
Example ra,dec = aa2radec( azimuth = 0, altitude = 90, lati = 48.85341, longi = 2.3488, elevation = 100, t =AstroPyNow )
|
||||
with AstroPyNow = Time.now()
|
||||
'''
|
||||
def aa2radec(azimuth, altitude, t):
|
||||
|
||||
#AstrObserver = EarthLocation(lat=lati * u.deg, lon=longi *u.deg, height= elevation*u.m,)
|
||||
ObjectCoord = SkyCoord(alt = altitude * u.deg, az = azimuth *u.deg, obstime = t, frame = 'altaz', location = AstrObserver)
|
||||
#print("icrs",ObjectCoord.icrs)
|
||||
#print("ICRS Right Ascension", ObjectCoord.icrs.ra)
|
||||
#print("ICRS Declination", ObjectCoord.icrs.dec)
|
||||
return ObjectCoord.icrs.ra.degree, ObjectCoord.icrs.dec.degree
|
||||
|
||||
|
||||
|
||||
# Use Skyfield to compute given object apparent positions (ra,dec,alt,az) and distance from given gps earth position (in decimal degrees) at UTC time (in skyfield format)
|
||||
def EarthObjPosition(object, t):
|
||||
|
||||
|
||||
#print (object, 'at', t.utc_iso())
|
||||
#SkyObserver = earth + Topos(gpslat, gpslong)
|
||||
astrometric = earth.at(t).observe(object)
|
||||
ra, dec, distance = astrometric.radec()
|
||||
'''
|
||||
print("Right ascencion",ra)
|
||||
print("RA in degree",ra._degrees)
|
||||
print("RA in radians",ra.radians)
|
||||
print("declinaison",dec)
|
||||
print (distance)
|
||||
'''
|
||||
ApparentPosition = SkyObserver.at(t).observe(object).apparent()
|
||||
#alt, az, distance = ApparentPosition.altaz('standard')
|
||||
alt, az, distance = ApparentPosition.altaz()
|
||||
'''
|
||||
print("UTC",t.utc_iso())
|
||||
print ("Altitude",alt)
|
||||
print("Altitude in radians",alt.radians)
|
||||
print("Altitude in degrees",alt.degrees)
|
||||
print("Altitude in dms",alt.dms(0))
|
||||
print("Altitude in signed_dms",alt.signed_dms(0))
|
||||
print("Azimuth", az.dstr())
|
||||
print ("Distance from position", distance)
|
||||
'''
|
||||
# If you want degree hours min : print (object,alt,az)
|
||||
# or you can do return ra._degrees, dec, alt.degrees, az, distance
|
||||
return alt.degrees, az.degrees, distance
|
||||
|
||||
|
||||
# Add Radec coordinates for all lasers from user defined Altaz coordinates in LaserSkies variable at given earth position and time.
|
||||
# LaserSkies : [LeftAzi, RightAzi, TopAlt, BotAlt, LeftRa, RightRa, TopDec, BottomDec]
|
||||
# 0 1 2 3 4 5 6 7
|
||||
def RadecSkies(LaserSkies, AstroSkyTime):
|
||||
|
||||
print()
|
||||
print("Converting", lasernumber, "LaserSkies limits in Right Ascension & Declination (radec) coordinates ")
|
||||
for laser in range(lasernumber):
|
||||
if debug > 0:
|
||||
print("Laser",laser)
|
||||
# Left top point
|
||||
LaserSkies[laser][4],LaserSkies[laser][6] = aa2radec(azimuth = LaserSkies[laser][0], altitude =LaserSkies[laser][2], t =AstroSkyTime)
|
||||
if debug > 0:
|
||||
print(LaserSkies[laser][4],LaserSkies[laser][6])
|
||||
# Right Bottom point
|
||||
LaserSkies[laser][5],LaserSkies[laser][7] = aa2radec(azimuth = LaserSkies[laser][1], altitude =LaserSkies[laser][3], t =AstroSkyTime)
|
||||
if debug > 0:
|
||||
print(LaserSkies[laser][5],LaserSkies[laser][7])
|
||||
if debug > 0:
|
||||
print(LaserSkies)
|
||||
print ("Done.")
|
||||
|
||||
|
||||
def azimuth2scrX(leftAzi,rightAzi,s):
|
||||
|
||||
a1, a2 = leftAzi, rightAzi
|
||||
b1, b2 = 0, width
|
||||
#if debug > 0:
|
||||
# print(leftAzi, rightAzi, s, b1 + ((s - a1) * (b2 - b1) / (a2 - a1)))
|
||||
return b1 + ((s - a1) * (b2 - b1) / (a2 - a1))
|
||||
|
||||
|
||||
|
||||
def altitude2scrY(topAlti,botAlti,s):
|
||||
a1, a2 = topAlti, botAlti
|
||||
b1, b2 = 0, height
|
||||
#if debug > 0:
|
||||
# print(topAlti,botAlti,s, b1 + ((s - a1) * (b2 - b1) / (a2 - a1)))
|
||||
return b1 + ((s - a1) * (b2 - b1) / (a2 - a1))
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Solar System
|
||||
#
|
||||
|
||||
SolarObjectShape = [(-50,30), (-30,-30), (30,-30), (10,30), (-50,30)]
|
||||
|
||||
# Planets Radius in km
|
||||
SolarObjectradius = [
|
||||
('Sun', 695500.0),
|
||||
('Mercury', 2440.0),
|
||||
('Venus', 6051.8),
|
||||
('Earth', 6371.01),
|
||||
('Mars', 3389.9),
|
||||
('Jupiter', 69911.0),
|
||||
('Saturn', 58232.0),
|
||||
('Uranus', 25362.0),
|
||||
('Neptune', 24624.0),
|
||||
('134340 Pluto', 1195.0),
|
||||
]
|
||||
|
||||
def LoadSolar():
|
||||
global planets, SolarObjects, earth
|
||||
|
||||
print("Loading Solar System (de421)...")
|
||||
# de421.bps https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/a_old_versions/de421.bsp
|
||||
planets = load('data/de421.bsp')
|
||||
earth = planets['earth']
|
||||
print('Loaded.')
|
||||
|
||||
# de421 objects
|
||||
# [Object name, object altitude, object azimuth]
|
||||
SolarObjects = [['MERCURY',0.0, 0.0], ['VENUS', 0.0, 0.0], ['JUPITER BARYCENTER', 0.0, 0.0], ['SATURN BARYCENTER', 0.0, 0.0], ['URANUS BARYCENTER', 0.0, 0.0], ['NEPTUNE BARYCENTER', 0.0, 0.0], ['PLUTO BARYCENTER', 0.0, 0.0], ['SUN', 0.0, 0.0], ['MOON', 0.0, 0.0], ['MARS', 0.0, 0.0]]
|
||||
|
||||
def UpdateSolar():
|
||||
global SolarObjects
|
||||
|
||||
# Compute Alt Az coordinates for all solar objects for obsehttps://www.startpage.com/do/searchrver.
|
||||
for number,object in enumerate(SolarObjects):
|
||||
|
||||
#print(object[0],number)
|
||||
SolarObjects[number][1], SolarObjects[number][2], distance = EarthObjPosition(planets[object[0]],SkyfieldTime)
|
||||
if debug > 0:
|
||||
PrintSolar()
|
||||
|
||||
|
||||
def PrintSolar():
|
||||
|
||||
for number,object in enumerate(SolarObjects):
|
||||
print (SolarObjects[number][0],"is at (alt,az)",SolarObjects[number][1],SolarObjects[number][2])
|
||||
|
||||
|
||||
# Draw the SolarShapeObject for any Solar object is in the laser Sky
|
||||
def DrawSolar(laser):
|
||||
|
||||
for number,object in enumerate(SolarObjects):
|
||||
|
||||
# Solar object is in given laser sky azimuth and altitude range ?
|
||||
if LaserSkies[laser][0] < SolarObjects[number][2] < LaserSkies[laser][1] and LaserSkies[laser][3] < SolarObjects[number][1] < LaserSkies[laser][2]:
|
||||
#print ("drawing",SolarObjects[number][0],SolarObjects[number][1],SolarObjects[number][2],"on laser",laser)
|
||||
lj3.rPolyLineOneColor(SolarObjectShape, c = white, PL = laser, closed = False, xpos = azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],SolarObjects[number][2]), ypos = altitude2scrY(LaserSkies[laser][2],LaserSkies[laser][3],SolarObjects[number][1]), resize = 2, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Stars
|
||||
#
|
||||
|
||||
StarsObjectShape = [(-10,10), (-10,-10), (10,-10), (10,10), (-10,10)]
|
||||
|
||||
def LoadHipparcos(ts):
|
||||
global hipdata
|
||||
|
||||
print("Loading hipparcos catalog...")
|
||||
#hipparcosURL = 'ftp://cdsarc.u-strasbg.fr/cats/I/239/hip_main.dat.gz'
|
||||
hipparcosURL = 'data/hip_main.dat.gz'
|
||||
with load.open(hipparcosURL) as f:
|
||||
hipdata = hipparcos.load_dataframe(f)
|
||||
#print("Loaded.")
|
||||
hipparcos_epoch = ts.tt(1991.25)
|
||||
|
||||
|
||||
# CODE IMPORTED HERE FROM TESTS. NEEDS TO ADAPT
|
||||
# Star selection
|
||||
def StarSelect():
|
||||
global StarsObjects, hipdatafilt
|
||||
|
||||
StarsObjects = [[]]
|
||||
#hipparcos_epoch = ts.tt(1991.25)
|
||||
#barnards_star = Star.from_dataframe(hipdata.loc[87937])
|
||||
#polaris = Star.from_dataframe(hipdata.loc[11767])
|
||||
print()
|
||||
print ("Stars selection...")
|
||||
|
||||
hipdatafilt = hipdata[hipdata['magnitude'] <= 3.5]
|
||||
print(('{} stars with magnitude <= 3.5'.format(len(hipdatafilt))))
|
||||
Starnames = hipdatafilt.index
|
||||
|
||||
StarsObjects[0] = [Starnames[0],0,0]
|
||||
for index in range(len(Starnames)-1):
|
||||
StarsObjects.append([Starnames[index+1],0,0])
|
||||
|
||||
|
||||
def UpdateStars(ts):
|
||||
global StarsObjects
|
||||
|
||||
hipparcos_epoch = ts.tt(1991.25)
|
||||
# Compute Alt Az coordinates for all solar objects for obsehttps://www.startpage.com/do/searchrver.
|
||||
for number,object in enumerate(StarsObjects):
|
||||
|
||||
#print(object[0],number)
|
||||
StarsObjects[number][1], StarsObjects[number][2], distance = EarthObjPosition(Star.from_dataframe(hipdatafilt.loc[StarsObjects[number][0]]),SkyfieldTime)
|
||||
|
||||
if debug > 0:
|
||||
PrintStars()
|
||||
|
||||
def PrintStars():
|
||||
|
||||
for number,object in enumerate(StarsObjects):
|
||||
print (StarsObjects[number][0],"is at (alt,az)",StarsObjects[number][1],StarsObjects[number][2])
|
||||
|
||||
def DrawStars(laser):
|
||||
|
||||
for number,object in enumerate(StarsObjects):
|
||||
|
||||
# Star object is in given lasersky altitude range ?
|
||||
if LaserSkies[laser][3] < StarsObjects[number][1] < LaserSkies[laser][2]:
|
||||
|
||||
# Star object is in given lasersky azimuth range ?
|
||||
if LaserSkies[laser][0] < StarsObjects[number][2] < LaserSkies[laser][1] :
|
||||
|
||||
#print ("drawing",StarsObjects[number][0],StarsObjects[number][1],StarsObjects[number][2],"on laser",laser)
|
||||
lj3.rPolyLineOneColor(StarsObjectShape, c = white, PL = laser, closed = False, xpos = azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],StarsObjects[number][2]), ypos = altitude2scrY(LaserSkies[laser][2],LaserSkies[laser][3],StarsObjects[number][1]), resize = 0.05, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
# Star object is in given lasersky North azimuth ?
|
||||
if LaserSkies[laser][0] > LaserSkies[laser][1] and StarsObjects[number][2] < LaserSkies[laser][1] :
|
||||
|
||||
#print ("drawing",StarsObjects[number][0],StarsObjects[number][1],StarsObjects[number][2],"on laser",laser)
|
||||
lj3.rPolyLineOneColor(StarsObjectShape, c = white, PL = laser, closed = False, xpos = azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],StarsObjects[number][2]), ypos = altitude2scrY(LaserSkies[laser][2],LaserSkies[laser][3],StarsObjects[number][1]), resize = 0.05, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# Anything system. Say you want
|
||||
#
|
||||
|
||||
AnythingObjectShape = [(-50,30), (-30,-30), (30,-30), (10,30), (-50,30)]
|
||||
|
||||
def LoadAnything():
|
||||
global planets, AnythingObjects, earth
|
||||
|
||||
print("Loading Anything System...")
|
||||
# de421.bps https://naif.jpl.nasa.gov/pub/naif/generic_kernels/spk/planets/a_old_versions/de421.bsp
|
||||
# planets = load('data/de421.bsp')
|
||||
earth = planets['earth']
|
||||
print('Loaded.')
|
||||
|
||||
# [Object name, object altitude, object azimuth]
|
||||
AnythingObjects = [['MERCURY',0.0, 0.0], ['VENUS', 0.0, 0.0], ['JUPITER BARYCENTER', 0.0, 0.0], ['SATURN BARYCENTER', 0.0, 0.0], ['URANUS BARYCENTER', 0.0, 0.0], ['NEPTUNE BARYCENTER', 0.0, 0.0], ['PLUTO BARYCENTER', 0.0, 0.0], ['SUN', 0.0, 0.0], ['MOON', 0.0, 0.0], ['MARS', 0.0, 0.0]]
|
||||
|
||||
def UpdateAnything():
|
||||
global AnythingObjects
|
||||
|
||||
# Compute Alt Az coordinates for all Anything objects for obsehttps://www.startpage.com/do/searchrver.
|
||||
for number,object in enumerate(AnythingObjects):
|
||||
|
||||
#print(object[0],number)
|
||||
AnythingObjects[number][1], AnythingObjects[number][2], distance = EarthObjPosition(planets[object[0]],SkyfieldTime)
|
||||
if debug > 0:
|
||||
PrintAnything()
|
||||
|
||||
|
||||
def PrintAnything():
|
||||
|
||||
for number,object in enumerate(AnythingObjects):
|
||||
print (AnythingObjects[number][0],"is at (alt,az)",AnythingObjects[number][1],AnythingObjects[number][2])
|
||||
|
||||
|
||||
# Draw the AnythingShapeObject for any Anything object is in the laser Sky
|
||||
def DrawAnything(laser):
|
||||
|
||||
for number,object in enumerate(AnythingObjects):
|
||||
|
||||
# Anything object is in given laser sky azimuth and altitude range ?
|
||||
if LaserSkies[laser][0] < AnythingObjects[number][2] < LaserSkies[laser][1] and LaserSkies[laser][3] < AnythingObjects[number][1] < LaserSkies[laser][2]:
|
||||
#print ("drawing",AnythingObjects[number][0],AnythingObjects[number][1],AnythingObjects[number][2],"on laser",laser)
|
||||
lj3.rPolyLineOneColor(AnythingObjectShape, c = white, PL = laser, closed = False, xpos = azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],AnythingObjects[number][2]), ypos = altitude2scrY(LaserSkies[laser][2],LaserSkies[laser][3],AnythingObjects[number][1]), resize = 2, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#
|
||||
# On Earth Gps positions
|
||||
# from https://github.com/lutangar/cities.json
|
||||
#
|
||||
def LoadCities():
|
||||
global world
|
||||
|
||||
print("Loading World Cities GPS position...")
|
||||
f=open("data/cities.json","r")
|
||||
s = f.read()
|
||||
world = json.loads(s)
|
||||
#print("Loaded.")
|
||||
|
||||
|
||||
# Get longitude and latitude of given City in given country. Need to better understand python dictionnaries.
|
||||
def CityPositiion(cityname, countrycode):
|
||||
|
||||
for city in range(len(world['cities'])):
|
||||
if world['cities'][city]['name']==cityname and world['cities'][city]['country']==countrycode:
|
||||
'''
|
||||
print (world['cities'][city]['country'])
|
||||
print (world['cities'][city]['name'])
|
||||
print (world['cities'][city]['lat'])
|
||||
print (world['cities'][city]['lng'])
|
||||
'''
|
||||
return float(world['cities'][city]['lat']), float(world['cities'][city]['lng'])
|
||||
|
||||
|
||||
|
||||
|
||||
# Add Kompass orientation to given laser point list if it is in laser sky at Y axis 300
|
||||
# point lasers to
|
||||
def DrawOrientation(laser):
|
||||
|
||||
#print("LaserSkies 0",LaserSkies[laser][0],"LaserSkies 1",LaserSkies[laser][1])
|
||||
# North direction is in given laser sky azimuth range?
|
||||
if LaserSkies[laser][1] < LaserSkies[laser][0]:
|
||||
#print ("N az",azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],0))
|
||||
lj3.Text("NORTH",white,laser,azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],359), 770, resize = 0.5, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
|
||||
# East direction is in given laser sky azimuth range ?
|
||||
if LaserSkies[laser][0] <= 90 < LaserSkies[laser][1]:
|
||||
#print ("E az",azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],0))
|
||||
lj3.Text("EAST",white,laser,azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],90), 770, resize = 0.5, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
# South direction is in given laser sky azimuth range ?
|
||||
if LaserSkies[laser][0] <= 180 < LaserSkies[laser][1]:
|
||||
#print ("S az",azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],0))
|
||||
lj3.Text("SOUTH",white,laser,azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],180), 770, resize = 0.5, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
# West direction is in given laser sky azimuth range ?
|
||||
if LaserSkies[laser][0] <= 270 < LaserSkies[laser][1]:
|
||||
#print ("W az",azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],0))
|
||||
lj3.Text("WEST",white,laser,azimuth2scrX(LaserSkies[laser][0],LaserSkies[laser][1],270), 770, resize = 0.5, rotx =0, roty =0 , rotz=0)
|
||||
|
||||
|
||||
|
||||
|
||||
# Compute LaserSkies Coordinates for observer
|
||||
def InitObserver(SkyCity, SkyCountryCode, time,ts):
|
||||
global LaserSkies, Skylat, Skylong, SkyfieldTime, AstrObserver, SkyObserver
|
||||
|
||||
# Observer position i.e : Paris FR
|
||||
#Skylat = 48.85341 # decimal degree
|
||||
#Skylong = 2.3488 # decimal degree
|
||||
#print()
|
||||
print("Observer GPS position and time...")
|
||||
Skylat, Skylong = CityPositiion(SkyCity,SkyCountryCode)
|
||||
print ("GPS Position of",SkyCity, "in", SkyCountryCode, ":",Skylat,Skylong)
|
||||
# City GPS altitude not in Cities database... Let's say it's :
|
||||
Skyelevation = 0 # meters
|
||||
|
||||
# Observer Time : Now
|
||||
# Other time in Astropy style
|
||||
# times = '1999-01-01T00:00:00.123456789'
|
||||
# t = Time(times, format='isot', scale='utc')
|
||||
#print()
|
||||
AstroSkyTime = time
|
||||
print ("AstroPy time", AstroSkyTime)
|
||||
SkyfieldTime = ts.from_astropy(AstroSkyTime)
|
||||
print("SkyfieldTime from AstropyUTC",SkyfieldTime.utc_iso())
|
||||
|
||||
AstrObserver = EarthLocation(lat = Skylat * u.deg, lon = Skylong * u.deg, height = Skyelevation * u.m,)
|
||||
SkyObserver = earth + Topos(Skylat, Skylong)
|
||||
|
||||
|
||||
# Computer for all Laser "skies" their Right Ascension/Declinaison coordinates from their Altitude/azimuth Coordinates.
|
||||
# to later select their visible objects in radec catalogs like hipparcos.
|
||||
# LaserSky definition for one laser (in decimal degrees) : [RightAzi, LeftAzi, TopAlt, BotAlt, LeftRa, RightRa, TopDec, BottomDec]
|
||||
# With 4 lasers with each one a quarter of the 360 ° real sky, there is 4 LaserSky :
|
||||
LaserSkies = [[45,135.0,90.0,0.0,0.0,0.0,0.0,0.0],[135,225,90,0,0,0,0,0],[225,315,90,0,0,0,0,0],[305,0,90,0,0,0,0,0]]
|
||||
RadecSkies(LaserSkies, AstroSkyTime)
|
||||
|
||||
|
||||
# Change Observer position by adding deltas (Gpslong, gpslat, elevation in decimal degree/meters)
|
||||
def UpdateObserver(gpslatdelta, gpslongdelta, elevationdelta,time,ts):
|
||||
global LaserSkies, Skylat, Skylong, SkyfieldTime, AstrObserver, SkyObserver
|
||||
|
||||
Skylat += gpslatdelta
|
||||
Skylong += gpslongdelta
|
||||
Skyelevation += elevationdelta
|
||||
AstroSkyTime = time
|
||||
print ("AstroPy time", AstroSkyTime)
|
||||
SkyfieldTime = ts.from_astropy(AstroSkyTime)
|
||||
print("SkyfieldTime from AstropyUTC",SkyfieldTime.utc_iso())
|
||||
|
||||
AstrObserver = EarthLocation(lat = Skylat * u.deg, lon = Skylong * u.deg, height = Skyelevation * u.m,)
|
||||
SkyObserver = earth + Topos(Skylat, Skylong)
|
||||
RadecSkies(LaserSkies, AstroSkyTime)
|
||||
|
||||
UpdateSolar()
|
||||
UpdateStars()
|
||||
UpdateAnything()
|
||||
|
||||
def NewTime(timeshift):
|
||||
|
||||
SkyfieldTime += timeshift
|
||||
|
||||
if DisplaySolar:
|
||||
UpdateSolar()
|
||||
if DisplayStars:
|
||||
UpdateStars()
|
||||
if DisplayAnything:
|
||||
UpdateAnything()
|
||||
|
||||
|
||||
def OSCstart(value):
|
||||
# Will receive message address, and message data flattened in s, x, y
|
||||
print("Planetarium OSC server got /planet/start with value", value)
|
||||
|
||||
|
||||
def OSCUI(value):
|
||||
# Will receive message address, and message data flattened in s, x, y
|
||||
print("Planetarium OSC server got /planet/planetUI with value", value)
|
||||
|
||||
def WebStatus(message):
|
||||
lj3.Send("/status",message)
|
||||
|
||||
#
|
||||
# Main part
|
||||
#
|
||||
|
||||
try:
|
||||
|
||||
WebStatus("Planetarium")
|
||||
|
||||
# OSC Server callbacks
|
||||
print("Starting OSC at 127.0.0.1 port",OSCinPort,"...")
|
||||
osc_startup()
|
||||
osc_udp_server("127.0.0.1", OSCinPort, "InPort")
|
||||
osc_method("/planet/start*", OSCstart)
|
||||
osc_method("/planet/planetUI*", OSCUI)
|
||||
|
||||
WebStatus("Load Cities.")
|
||||
ts = load.timescale()
|
||||
LoadCities()
|
||||
|
||||
SkyCity = 'Paris'
|
||||
SkyCountryCode = 'FR'
|
||||
WebStatus(SkyCity)
|
||||
|
||||
WebStatus("Solar System..")
|
||||
LoadSolar()
|
||||
|
||||
WebStatus("Observer..")
|
||||
InitObserver(SkyCity, SkyCountryCode, Time.now(),ts)
|
||||
|
||||
WebStatus("Load Stars..")
|
||||
LoadHipparcos(ts)
|
||||
StarSelect()
|
||||
|
||||
WebStatus("Updating...")
|
||||
print("Updating solar system (de421) objects position for observer at", Skylat, Skylong, "time", SkyfieldTime.utc_iso())
|
||||
UpdateSolar()
|
||||
|
||||
print("Updating stars for observer at", Skylat, Skylong, "time", SkyfieldTime.utc_iso())
|
||||
UpdateStars(ts)
|
||||
|
||||
WebStatus("Ready")
|
||||
lj3.Send("/planet/start",1)
|
||||
print ("Done.")
|
||||
|
||||
# UpdateStars() Todo
|
||||
|
||||
DisplayStars = True
|
||||
DisplaySolar = False
|
||||
DisplayOrientation = True
|
||||
DisplayAnything = False
|
||||
print("Start displaying on",lasernumber,"lasers")
|
||||
|
||||
while 1:
|
||||
|
||||
for laser in range(lasernumber):
|
||||
|
||||
#print ("Drawing laser",lasernumber)
|
||||
if DisplayOrientation:
|
||||
DrawOrientation(laser)
|
||||
lj3.OSCframe()
|
||||
|
||||
if DisplaySolar:
|
||||
DrawSolar(laser)
|
||||
lj3.OSCframe()
|
||||
|
||||
if DisplayStars:
|
||||
DrawStars(laser)
|
||||
lj3.OSCframe()
|
||||
|
||||
if DisplayAnything:
|
||||
DrawAnything()
|
||||
lj3.OSCframe()
|
||||
|
||||
lj3.DrawPL(laser)
|
||||
lj3.OSCframe()
|
||||
|
||||
time.sleep(0.01)
|
||||
|
||||
|
||||
except KeyboardInterrupt:
|
||||
pass
|
||||
|
||||
# Gently stop on CTRL C
|
||||
|
||||
finally:
|
||||
|
||||
WebStatus("Planet Exit")
|
||||
print("Stopping OSC...")
|
||||
lj3.OSCstop()
|
||||
|
||||
print ("Fin du planetarium.")
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,83 +0,0 @@
|
|||
# coding=UTF-8
|
||||
|
||||
'''
|
||||
Cycling text on one LJ laser.
|
||||
LICENCE : CC
|
||||
'''
|
||||
|
||||
import redis
|
||||
import lj
|
||||
import sys,time
|
||||
import argparse
|
||||
|
||||
duration = 300
|
||||
lasertext = ["TEAMLASER","FANFAN","LOLOSTER","SAM"]
|
||||
|
||||
'''
|
||||
is_py2 = sys.version[0] == '2'
|
||||
if is_py2:
|
||||
from Queue import Queue
|
||||
else:
|
||||
from queue import Queue
|
||||
'''
|
||||
print ("")
|
||||
print ("Arguments parsing if needed...")
|
||||
argsparser = argparse.ArgumentParser(description="Text Cycling for LJ")
|
||||
argsparser.add_argument("-r","--redisIP",help="IP of the Redis server used by LJ (127.0.0.1 by default) ",type=str)
|
||||
argsparser.add_argument("-c","--client",help="LJ client number (0 by default)",type=int)
|
||||
argsparser.add_argument("-l","--laser",help="Laser number to be displayed (0 by default)",type=int)
|
||||
|
||||
args = argsparser.parse_args()
|
||||
|
||||
|
||||
if args.client:
|
||||
ljclient = args.client
|
||||
else:
|
||||
ljclient = 0
|
||||
|
||||
if args.laser:
|
||||
plnumber = args.laser
|
||||
else:
|
||||
plnumber = 0
|
||||
|
||||
# Redis Computer IP
|
||||
if args.redisIP != None:
|
||||
redisIP = args.redisIP
|
||||
else:
|
||||
redisIP = '127.0.0.1'
|
||||
|
||||
lj.Config(redisIP,ljclient)
|
||||
#r = redis.StrictRedis(host=redisIP, port=6379, db=0)
|
||||
|
||||
|
||||
# If you want to use rgb for color :
|
||||
def rgb2int(r,g,b):
|
||||
return int('0x%02x%02x%02x' % (r,g,b),0)
|
||||
|
||||
|
||||
def Run():
|
||||
|
||||
counter =0
|
||||
step = 0
|
||||
timing = -1
|
||||
color = rgb2int(255,255,255)
|
||||
|
||||
|
||||
while 1:
|
||||
|
||||
if timing == duration or timing == -1:
|
||||
message = lasertext[step]
|
||||
lj.Text(message, color, PL = 0, xpos = 300, ypos = 300, resize = 1, rotx =0, roty =0 , rotz=0)
|
||||
lj.DrawPL(0)
|
||||
timing = 0
|
||||
|
||||
else:
|
||||
step += 1
|
||||
if step >3:
|
||||
step =0
|
||||
timing += 1
|
||||
time.sleep(0.01)
|
||||
|
||||
Run()
|
||||
|
||||
|
||||
Loading…
Add table
Add a link
Reference in a new issue