#-----------------------------------------------------------------------
#                   Primitive tsxPython sample script
#                            Color a roulette
# 
# $Id: 020_roulette_color1a.py 74 2019-04-23 20:56:30Z 3DfromNULL $
#-----------------------------------------------------------------------
import ptsxpy as p
import ptsxgp
import math

wk1 = ptsxgp.alloc_long( 1 ) #######
p.MaterialCreate( wk1 )
mate1 = ptsxgp.loadptr( wk1 )
p.MaterialCreate( wk1 )
mate2 = ptsxgp.loadptr( wk1 )

#----------
# Color metallic parts
#----------
# Select Chrome shader
p.SetMaterialShader( mate1, CSHID_C_CHROME )
# Search color parameter
si1 = p.MaterialGetShaderInfo( mate1, tsxSHCLASS_COLOR )
nsiparam = p.ShaderInfoGetParametersNumber( si1 )
print( "nsiparam=", nsiparam )
found = 0
wks1 = ptsxgp.alloc_char( 1000 )
for i in range( nsiparam ):
    p.ShaderInfoGetParameterName( si1, i, wks1 )
    s1 = ptsxgp.loadstr( wks1 )
    pid1 = p.ShaderInfoGetParameterID( si1, i )
    print( i, pid1, s1 )
    if pid1 == CSPID_C_CHROME_BASECOLOR:
        found = 1
        idx = i
        #break
if not found:
    print( "error: shader info parameter, CSPID_C_CHROME_BASECOLOR not found." )
    stop #####
# Set the parameter
spval1 = p.ShaderInfoGetParameterValue( si1, idx )
sptype1 = p.ParameterValueGetType( spval1 )
print( "sptype1=", sptype1 )
if sptype1 != tsxSHPARAM_COLOR:
    print( "error: this shader parameter type must be tsxSHPARAM_COLOR. It was ", sptype1 )
    stop #####
colwk1 = Vec3f()
p.ParameterValueGetData( spval1, colwk1.p )
print( "colwk1=", colwk1.prt() )
colwk1.set_x( 1. ) # Golden metal
colwk1.set_y( 0.8 )
colwk1.set_z( 0.3 )
p.ParameterValueSetData( spval1, colwk1.p )
# Color some parts
ret = p.GNodeFindByName( wk1, 0, "Roulette" )
print( "ret=", ret )
ob1 = ptsxgp.loadptr( wk1 )
ret = p.GNodeFindByName( wk1, ob1, "Rotor" )
print( "ret=", ret )
ob2 = ptsxgp.loadptr( wk1 )
ret = p.GNodeFindByName( wk1, ob2, "CenterTower" )
print( "ret=", ret )
ob3 = ptsxgp.loadptr( wk1 )
ob4 = p.GNodeGetFirstChild( ob3 )
while ob4 != 0:
    p.PolyhPaint( ob4, mate1 )
    ob4 = p.GNodeGetNext( ob4 )
ret = p.GNodeFindByName( wk1, ob2, "PocketFrame" )
print( "ret=", ret )
ob2 = ptsxgp.loadptr( wk1 )
p.PolyhPaint( ob2, mate1 )
ret = p.GNodeFindByName( wk1, ob1, "Stationary" )
print( "ret=", ret )
ob2 = ptsxgp.loadptr( wk1 )
ret = p.GNodeFindByName( wk1, ob2, "BallDeflectors" )
print( "ret=", ret )
ob3 = ptsxgp.loadptr( wk1 )
ob4 = p.GNodeGetFirstChild( ob3 )
p.MaterialSetFacetingType( mate1, tsxFACET_AUTO )
while ob4 != 0:
    p.PolyhPaint( ob4, mate1 )
    ob4 = p.GNodeGetNext( ob4 )

#----------
# Color the rim
#----------
#col1 = Color( 0x40, 0x12, 0x00, 100 ) # dark brown
#p.MaterialSetColor( mate2, col1.p )
p.SetMaterialShader( mate2, CSHID_R_TRANSLUCENTPLASTIC )
# Search ambient factor parameter
si1 = p.MaterialGetShaderInfo( mate2, tsxSHCLASS_REFLECTANCE )
nsiparam = p.ShaderInfoGetParametersNumber( si1 )
print( "nsiparam=", nsiparam )
found = 0
wks1 = ptsxgp.alloc_char( 1000 )
for i in range( nsiparam ):
    p.ShaderInfoGetParameterName( si1, i, wks1 )
    s1 = ptsxgp.loadstr( wks1 )
    pid1 = p.ShaderInfoGetParameterID( si1, i )
    print( i, pid1, s1 )
    if pid1 == CSPID_R_AMBIENTFACTOR:
        found = 1
        idx = i
        #break
if not found:
    print( "error: shader info parameter, CSPID_R_AMBIENTFACTOR (%d) not found." % CSPID_R_AMBIENTFACTOR )
    stop #####
# Set the parameter
spval1 = p.ShaderInfoGetParameterValue( si1, idx )
sptype1 = p.ParameterValueGetType( spval1 )
print( "sptype1=", sptype1 )
if sptype1 != tsxSHPARAM_FLOAT:
    print( "error: this shader parameter type must be tsxSHPARAM_FLOAT. It was ", sptype1 )
    stop #####
p.ParameterValueGetData( spval1, wk1 )
f1 =  ptsxgp.loadfloat( wk1 )
print( "f1=", f1 )
ptsxgp.storefloat( wk1, 0.4 )
p.ParameterValueSetData( spval1, wk1 )
# Search color parameter
si1 = p.MaterialGetShaderInfo( mate2, tsxSHCLASS_COLOR )
nsiparam = p.ShaderInfoGetParametersNumber( si1 )
print( "nsiparam=", nsiparam )
found = 0
wks1 = ptsxgp.alloc_char( 1000 )
for i in range( nsiparam ):
    p.ShaderInfoGetParameterName( si1, i, wks1 )
    s1 = ptsxgp.loadstr( wks1 )
    pid1 = p.ShaderInfoGetParameterID( si1, i )
    print( i, pid1, s1 )
    if pid1 == CSPID_C_PLAIN_COLOR:
        found = 1
        idx = i
        #break
if not found:
    print( "error: shader info parameter, CSPID_C_PLAIN_COLOR not found." )
    stop #####
# Set the parameter
spval1 = p.ShaderInfoGetParameterValue( si1, idx )
sptype1 = p.ParameterValueGetType( spval1 )
print( "sptype1=", sptype1 )
if sptype1 != tsxSHPARAM_COLOR:
    print( "error: this shader parameter type must be tsxSHPARAM_COLOR. It was ", sptype1 )
    stop #####
colwk1 = Vec3f()
p.ParameterValueGetData( spval1, colwk1.p )
print( "colwk1=", colwk1.prt() )
colwk1.set_x( 0.145 ) # dark brown
colwk1.set_y( 0.035 )
colwk1.set_z( 0. )
p.ParameterValueSetData( spval1, colwk1.p )
p.MaterialSetFacetingType( mate2, tsxFACET_AUTO )
# Search target object
ret = p.GNodeFindByName( wk1, ob1, "Stationary" )
print( "ret=", ret )
ob2 = ptsxgp.loadptr( wk1 )
ret = p.GNodeFindByName( wk1, ob2, "Rim" )
print( "ret=", ret )
ob3 = ptsxgp.loadptr( wk1 )
p.MaterialSetFacetingType( mate2, tsxFACET_AUTO )
p.PolyhPaint( ob3, mate2 )


#----------
# Color the stationary bowl
#----------
col1 = Color( 0xd2, 0xca, 0xa6, 100 ) # dark brown
p.MaterialSetColor( mate2, col1.p )
ret = p.GNodeFindByName( wk1, ob2, "Bowl" )
print( "ret=", ret )
ob3 = ptsxgp.loadptr( wk1 )
p.MaterialSetFacetingType( mate2, tsxFACET_FACETED )
p.PolyhPaint( ob3, mate2 )

##############
##############

sh1 = p.ShaderGetFirst()
p.ShaderSelect( sh1 )

#sh1 = p.ShaderGetFirst()
#while sh1 != 0:
#    nam = p.ShaderGetInternalName( sh1 )
#    cls = p.ShaderGetClass( sh1 )
#    print( "cls=", cls, ", nam=", nam )
#    sh1 = p.ShaderGetNext( sh1 )

p.Free( wk1 )
p.Free( wks1 )
p.MaterialDestroy( mate1 )
p.MaterialDestroy( mate2 )
p.SceneDraw()


