#########################
#-*- coding: utf-8 -*-
###################################
### DM2_w25 # AGruber@tugraz.at ###
### DEMO       SWAN      
###################################

##############################
import rhinoscriptsyntax as rs
import random, time, sys   ###
sys.path.append("P:/")     ###
sys.path.append("P:/WWW/ver30/dm2/")
import DM_lib as dm        ### dm.reload_lib(dm)
##############################      

############################## hier passenden pfad eintragen ! 
path_for_lists = "L:/DM2/hasanaginica/"
sys.path.append( path_for_lists ) ###                                            
############################## hier passenden pfad eintragen !

rs.UnitSystem(4)                                            # meters = 4, cm = 3 etc
rs.ShowGrid(None, False)                                    # grid > False = off
rs.ShowGridAxes(None, True)                                 # y/y/z axen display > False/True = off/on
rs.Command("cplane w t enter", False)				        # cPlane World Top
#rs.ViewDisplayMode(rs.CurrentView(), "pen")

dm.PointRadius(displayModeX=1001, rad=3, styl=3)               # 0 => wireframe | info: (.., verbose=1)            # 2 => rendered  | info: (.., verbose=1)
dm.printDisplay(state=False, scale=1000)                       # nomen est omen
rs.EnableRedraw(False)
rs.AppearanceColor(0, [0,100,200])
dm.newEmptyLayer("Default")
rs.LayerVisible ("schwan", 0)

swan_coords = rs.CurvePoints( rs.ObjectsByName("swan_proto")[0] )[0:-2]
swan_coords = rs.CurvePoints( rs.ObjectsByName("star_proto")[0] )#[0:-2]

###   EXPORT coords: just once !
dem = rs.ObjectsByName("dem_5")[0]
if 0: ######### EXPORT
    dem_coords = dm.getSurfacePoints(dem)
    dm.exportCoordLists([dem_coords], exportedListName='dem_coords', path=path_for_lists, fileName='dem_coords_X')

###   IMPORT coords 
dm.setTime()
import dem_coords as dc 
dm.reload_lib( dc )
dem_coords = dc.dem_coords[0]
print ("*** {} coords imported in {}s".format(len(dem_coords), dm.getTime()))

### RESET / clear all
dm.newEmptyLayer("XXX::schnee", [250,250,250])
dm.newEmptyLayer("XXX", [200,200,50])
rs.Redraw()
rs.Sleep(1000)

### RESET surface
dm.setSurfacePoints(dem, dem_coords)
rs.ZoomExtents()
rs.Redraw()
rs.Sleep(1000)


#swan_coords = swan_coords[0:-2]
#dm.textDots( swan_coords )
#rs.AddCurve( dem_coords )
#rs.AddCurve( swan_coords, 3 )
#rs.AddCurve( swan_coords, 2 )
#rs.AddCurve( swan_coords, 3 )

def makeSwanCrv( pos=[0,0,0], scal=1.0, rota=0.0, deg=3 ):
    coords = swan_coords[:]
    #rs.AddPoint( dm.pntCentroid( coords ) )
    coords = [ rs.VectorScale( cor, scal ) for cor in coords ]
    #coords = [ rs.VectorRotate( cor, rota, [0,0,1] ) for cor in coords ]
    axe = dm.randVec()
    coords = [ rs.VectorRotate( cor, rota, axe ) for cor in coords ]
    center = dm.pntCentroid( coords )
    coords = [ rs.VectorSubtract( cor, center ) for cor in coords ]
    coords = [ rs.VectorAdd( cor, dm.pnt2XY0(pos) ) for cor in coords ]
    #rs.AddCurve( coords, deg )
    return coords

#makeSwanCrv( pos=[0,0,0], scal=0.5, rota=30.0, deg=3 )

#pos = random.choice( dem_coords )
#rs.AddPoint( pos )

#dm.setSurfacePoints(dem, dc.dem_coords[0])
path = "P:/finale_02/images/"
imageName = "schneeeee.png"

rs.LayerVisible( "DEM", 1)
for i in range(2**6):
    dm.esc()
    rs.CurrentLayer("XXX")
    pos = random.choice( dem_coords )
    scal=random.uniform(2,6)    ### swan
    scal=random.uniform(0.5,5)  ### star
    rota=random.uniform(0,360)
    coords = makeSwanCrv( pos=pos, scal=scal, rota=rota)
    swan = rs.AddCurve( coords, random.randint(1,4) )
    
    swan_projected = rs.ProjectCurveToSurface( swan, dem, [0,0,1]  )
    bBox = rs.BoundingBox( swan_projected )
    minZ = bBox[0][2]+(bBox[4][2]-bBox[0][2])*0.5
    if 1:
        in_swan_coords = []
        dem_tmp = dm.getSurfacePoints(dem) #dem_coords[:]
        col = dm.randVec( 160, 220 )
        col = dm.randVec( 155, 255 )
        col = [random.randint(240,250),random.randint(240,250),random.randint(200,200)]
        #rs.Command("-ProjectToCPlane -selID "+str(swan)+" enter Yes enter", 0)
        if 1:
            rs.CurrentLayer("XXX::schnee")
            schnee_coords = []
            for cor in dem_tmp:
                if rs.PointInPlanarClosedCurve(dm.pnt2XY0(cor), swan):
                    in_swan_coords.append(cor)
                    #cor[2] -= 20
                    cor[2] = minZ
                    if random.randint(0,100)<180:
                        corx = rs.VectorAdd(cor, [0,0, random.uniform(0,10)**2.0] )
                        #pnt = rs.AddPoint( corx )
                        #rs.ObjectColor( pnt, col)
                        schnee_coords.append(corx)
            dm.setSurfacePoints(dem, dem_tmp)
            dm.eDup()
            #rs.AddPoints( schnee_coords )
            new_snow = []
            schnee_hoehe = 2.0
            schnee_steps = 10
            for s in range(schnee_steps):
                dm.esc()
                new_snow = []
                for c, corX in enumerate(schnee_coords):
                    dm.esc()
                    if corX[2] > minZ+schnee_hoehe:
                        corX[2] -= random.uniform(5,20)
                    else:
                        corX[2] = minZ+schnee_hoehe+random.uniform(-1,1)
                    if corX[2] > minZ+schnee_hoehe:
                        schnee_coords[c]=corX
                        flocke = rs.AddPoint( corX )
                        new_snow.append( flocke )
                rs.Redraw()
                rs.Sleep(100)
                if s<schnee_steps-1:        ### letzte schicht verbleibt
                    rs.DeleteObjects( new_snow ) 
                #rs.Redraw()
                
        #rs.ObjectLayer(rs.ObjectsByType(1), "XXX::schnee")
        print ("{} dingsls - {} points".format(i, len(rs.ObjectsByType(1)), len(dem_coords)))
    rs.ViewDisplayMode(rs.CurrentView(), "ghosted")
    rs.Redraw()
    dm.zA()
    rs.Command("-_viewCaptureToFile Width=640 Height=360 Scale=2 TransparentBackground=No "+path+imageName, False)
    #rs.ViewDisplayMode(rs.CurrentView(), "wireframe")
dm.zA()

#rs.Redraw()




############################
########## EOS / EndOfScript
rs.EnableRedraw(True)     ### 4_the_MACs
#dm.eDup()                 ### delete duplicate objects 
dm.printDisplay(state=True, scale=1000)
#dm.zA( 0.9 )
dm.newEmptyLayer("Default")
print "done"