# ----------------------------------------
# Hdrshop Light Importer v0.3
# Jm Soler 04/2004 update 10/01/2009
#
# Ce script est proposé sous licence GPL.
# this script is under GPL licence.
#
# ----------------------------------------
#
#  pour fonctionner ce script doit pouvoir acceder
#  a un fichier texte contenant les informations
#  exportees par le LightGen_plugin de HdrShop
#
# ----------------------------------------

import Blender
from math import *

def oriente(s,ori):
                  xyz=Blender.Mathutils.Vector(ori.mat*s)
                  xadawi=Blender.Mathutils.Vector(s+s)                   
                  albega=Blender.Mathutils.Vector(ori.mat*xadawi)
                  s= albega-xyz
                  s.normalize()
                  if abs(s[1])<0.0001:
                   s[1]=0.0
                  RotX=0
                  teta=-acos(s[2])
                  RotY=-pi+teta
                  if s[1]!=0:
                   RotZ=-acos(s[0]/sin(teta))*s[1]/abs(s[1])
                  else:
                   RotZ=0
                   if s[0]>0:
                    RotY=-RotY
                  return [RotX, RotY, RotZ] 

def cree_objet(ob,col,pos, rad, ori , energy, cmax):
     O = Blender.Object.New (ob)
     obj= O.getData()
     O.link (obj)
     if ob=='Lamp':
                  obj.setType('Spot') 
                  obj.type=2 
                  # type spot
                  obj.dist=rad*2.5
                  # ------------------------------
                  # distance sur  laquelle le spot projette sa lumière
                  # ------------------------------
                  obj.energy=energy 
                  # ------------------------------
                  # energie, plutôt basse pour ne pas saturer
                  # ------------------------------
                  obj.spotSize=120.0 
                  # ------------------------------
                  # angle d'ouverture du cone lumineux
                  # ------------------------------
                  obj.spotBlend=0.7 
                  # ------------------------------
                  # largeur de la frange de penombre
                  # ------------------------------
                  obj.setMode('Shadows') 
                  # ------------------------------
                  # utilisation des ombres 
                  # ------------------------------
                  for m in [0,1,2]:
                      col[m]/=cmax
                  # ------------
                  #  Champs de reglage des couleurs
                  # -------------
                  obj.col=col[:]

                  print col[0], obj.col[0] 

     O.setEuler(oriente(Blender.Mathutils.Vector([-pos[0],-pos[1],-pos[2]]),ori))
     for m in [0,1,2]:
        pos[m]*=rad
     O.setLocation(pos)

     return O

#--------------------------
#  distance a laquelle seront placees les lampes
#--------------------------
rayon=30.0

#--------------------------
# controle du numero de version
#--------------------------
version=Blender.Get('version')


def cree_leslampes(filename):

    f=open(filename,"r")
    tableau=f.readlines()
    f.close()

    c=[[],[]]
    cmax=[0.0,0.0,0.0]

    for n in range(len(tableau)):
	
        if tableau[n].find('Color:')!=-1:
           c[0].append(tableau[n].split(' '))
           C=c[0][-1]
           print 'C   :  ', C   
           C[-1]=C[-1][:-1] 
           del C[0:2]
           print 'C   :  ', C   
           for m in [0,1,2]:
              C[m]=round(float(C[m]),8)
              print 'm :',m,' , ',C[m]  
              if C[m]>cmax[m]:
                 cmax[m]=C[m]

           if tableau[n+1].find('Direction:')!=-1:
               c[1].append(tableau[n+1].split(' '))
               D=c[1][-1]
               D[-1]=D[-1][:-1] 
               del D[0:1]
               D[-1]=D[-1][:-1]
               for m in [0,1,2]:
                   D[m]=round(float(D[m]),5)

           print c[0][-1],c[1][-1]

    cmax.sort()
    print cmax
    energy=1.0
    intensite=1.0

    energy=1000.0/cmax[2]*intensite

    n=0
    scene = Blender.Scene.getCurrent ()

    try:
      ori=Blender.Object.Get('origine')
    except:
      object=Blender.Object.New('Empty','origine')
      object.LocX=0.0
      object.LocZ=0.0
      object.LocY=0.0
      object.RotX=0.0
      object.RotZ=0.0
      object.RotY=0.0
      scene.link (object)
      ori=Blender.Object.Get('origine')
			
    for L in c[0]:
        scene.link (cree_objet('Lamp',
                   L,
                   c[1][n],
                   rayon, 
                   ori, 
                   energy, cmax[2]) )
        n+=1 
    Blender.Redraw()

Blender.Window.FileSelector(cree_leslampes,'SELECT LIGHTS FILE')