#!/usr/bin/python3 # -*- coding: utf-8 -*- # -*- mode: Python -*- ''' example, based on custom v0.1.0 A copy of square.py you can modify to code your plugin. custom1 has necessary hooks in LJ.conf, webui and so on. LICENCE : CC by Sam Neurohack ''' import sys import os ljpath = r'%s' % os.getcwd().replace('\\','/') # import from shell sys.path.append(ljpath +'/../../libs/') #import from LJ sys.path.append(ljpath +'/libs/') print(ljpath+'/../libs/') import lj23layers as lj sys.path.append('../libs') import math import time import argparse print ("") print ("Arguments parsing if needed...") argsparser = argparse.ArgumentParser(description="Custom1 example for LJ") argsparser.add_argument("-v","--verbose",help="Verbosity level (0 by default)",default=0,type=int) args = argsparser.parse_args() # Useful variables init. white = lj.rgb2int(255,255,255) red = lj.rgb2int(255,0,0) blue = lj.rgb2int(0,0,255) green = lj.rgb2int(0,255,0) width = 800 height = 600 centerX = width / 2 centerY = height / 2 # 3D to 2D projection parameters fov = 256 viewer_distance = 2.2 # Anaglyph computation parameters for right and left eyes. # algorythm come from anaglyph geo maps eye_spacing = 100 nadir = 0.5 observer_altitude = 30000 map_layerane_altitude = 0.0 # square coordinates : vertices that compose each of the square. vertices = [ (- 1.0, 1.0,- 1.0), ( 1.0, 1.0,- 1.0), ( 1.0,- 1.0,- 1.0), (- 1.0,- 1.0,- 1.0) ] face = [0,1,2,3] # # LJ inits # layer = 0 # Define properties for each drawn "element" : name, intensity, active, xy, color, red, green, blue, layer , closed Leftsquare = lj.FixedObject('Leftsquare', True, 255, [], red, 255, 0, 0, layer , True) Rightsquare = lj.FixedObject('Rightsquare', True, 255, [], green, 0, 255, 0, layer , True) # 'Destination' for given layer : name, number, active, layer , scene, laser Dest0 = lj.DestObject('0', 0, True, 0 , 0, 0) # Dest0 will send layer 0 points to scene 0, laser 0 # # Anaglyph computation : different X coordinate for each eye # def LeftShift(elevation): diff = elevation - map_layerane_altitude return nadir * eye_spacing * diff / (observer_altitude - elevation) def RightShift(elevation): diff = map_layerane_altitude - elevation return (1 - nadir) * eye_spacing * diff / (observer_altitude - elevation) 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) # # Main # def Run(): Left = [] Right = [] counter =0 try: while True: Left = [] Right = [] x = vertices[0][0] y = vertices[0][1] z = vertices[0][2] # 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. # generate all points in square. for point in face: 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)) lj.polylineonecolor(left, c = leftsquare.color , layer = leftsquare.layer, closed = leftsquare.closed) lj.polylineonecolor(right, c = rightsquare.color , layer = rightsquare.layer, closed = rightsquare.closed) lj.drawdests() time.sleep(0.1) counter += 1 if counter > 360: counter = 0 except KeyboardInterrupt: pass # Gently stop on CTRL C finally: lj.ClosePlugin() Run()