/
materialtest.py
164 lines (128 loc) · 8.73 KB
/
materialtest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
import os
import darkradiant as dr
# Some interface tests
print("bc_rat can be modified" if GlobalMaterialManager.materialCanBeModified('bc_rat') else "bc_rat cannot be modified")
bcRatCopy = GlobalMaterialManager.copyMaterial('bc_rat', 'bc_rat_copy')
print("Got a copy of bc_rat named {0}".format(bcRatCopy.getName()))
print("The copy can be modified" if GlobalMaterialManager.materialCanBeModified(bcRatCopy.getName()) else "The copy cannot be modified?")
try:
bcRat = GlobalMaterialManager.getMaterial('bc_rat')
bcRat.setEditorImageExpressionFromString('this is gonna blow')
except RuntimeError as e:
print('An exception has been thrown: {}'.format(e))
print("Removing the copy again...")
GlobalMaterialManager.removeMaterial(bcRatCopy.getName())
print('Create an empty material named textures/python/blah...')
newMaterial = GlobalMaterialManager.createEmptyMaterial('textures/python/blah')
print("The new material can be modified" if GlobalMaterialManager.materialCanBeModified(newMaterial.getName()) else "The new material cannot be modified?")
renameResult = GlobalMaterialManager.renameMaterial(newMaterial.getName(), newMaterial.getName() + '_renamed')
print("The rename operation was successful" if renameResult else "The rename operation failed")
# Do something with the new material
print('The existing material reference now has the name {0}'.format(newMaterial.getName()))
filename = 'materials/_python_test.mtr'
newMaterial.setShaderFileName(filename)
newMaterial.setEditorImageExpressionFromString('textures/common/caulk')
newMaterial.setSortRequest(45.3)
print('Surface Type: {0}'.format(newMaterial.getSurfaceType()))
print('Cull type: {0}'.format(newMaterial.getCullType()))
print('Clamp type: {0}'.format(newMaterial.getClampType()))
print('Flags: {0}'.format(newMaterial.getMaterialFlags()))
print('Surface Flags: {0}'.format(newMaterial.getSurfaceFlags()))
print('Deform Type: {0}'.format(newMaterial.getDeformType()))
print('Deform Expression #1: {0}'.format(newMaterial.getDeformExpressionString(0)))
print('Deform Decl Name: {0}'.format(newMaterial.getDeformDeclName()))
print('Spectrum: {0}'.format(newMaterial.getSpectrum()))
print('DecalInfo.stayMilliSeconds: {0}'.format(newMaterial.getDecalInfo().stayMilliSeconds))
print('DecalInfo.fadeMilliSeconds: {0}'.format(newMaterial.getDecalInfo().fadeMilliSeconds))
print('DecalInfo.startColour: {0}'.format(newMaterial.getDecalInfo().startColour))
print('DecalInfo.endColour: {0}'.format(newMaterial.getDecalInfo().endColour))
print('Coverage: {0}'.format(newMaterial.getCoverage()))
print('Light Falloff Map Type: {0}'.format(newMaterial.getLightFalloffCubeMapType()))
print('Renderbump Arguments: {0}'.format(newMaterial.getRenderBumpArguments()))
# There are a couple of pre-defined sort requests, corresponding to the engine code
newMaterial.setSortRequest(dr.Material.SortRequest.NEAREST)
newMaterial.setClampType(dr.Material.ClampType.NOREPEAT) # clamp
newMaterial.setCullType(dr.Material.CullType.NONE) # twosided
newMaterial.setPolygonOffset(0.3)
newMaterial.setMaterialFlag(dr.Material.Flag.NOSHADOWS)
newMaterial.setSurfaceFlag(dr.Material.SurfaceFlag.LADDER)
newMaterial.setSurfaceFlag(dr.Material.SurfaceFlag.NONSOLID)
newMaterial.setSurfaceType(dr.Material.SurfaceType.WOOD)
newMaterial.setSpectrum(5)
newMaterial.setIsFogLight(1)
newMaterial.setIsBlendLight(0)
newMaterial.setDescription("New Material")
stageIndex = newMaterial.addStage(dr.MaterialStage.Type.BLEND)
print('Material has now {0} stages'.format(newMaterial.getNumStages()))
newMaterial.removeStage(stageIndex)
diffuseStageIndex = newMaterial.addStage(dr.MaterialStage.Type.DIFFUSE)
diffuseStage = newMaterial.getStage(diffuseStageIndex)
bumpStageIndex = newMaterial.duplicateStage(diffuseStageIndex)
bumpStage = newMaterial.getStage(bumpStageIndex)
print('Material has now {0} stages'.format(newMaterial.getNumStages()))
# Edit some stage parameters
editableDiffuseStage = newMaterial.getEditableStage(diffuseStageIndex)
editableDiffuseStage.setStageFlag(dr.MaterialStage.Flag.IGNORE_ALPHATEST)
editableDiffuseStage.clearStageFlag(dr.MaterialStage.Flag.FILTER_LINEAR)
editableDiffuseStage.setMapType(dr.MaterialStage.MapType.CUBEMAP)
editableDiffuseStage.setMapExpressionFromString("env/sky1")
editableDiffuseStage.setBlendFuncStrings(["gl_one", "gl_dest_alpha"])
editableDiffuseStage.setAlphaTestExpressionFromString("sinTable[time]")
editableDiffuseStage.addTransformation(dr.MaterialStage.TransformType.SCALE, "time", "global0")
rotateIndex = editableDiffuseStage.addTransformation(dr.MaterialStage.TransformType.ROTATE, "time*0.5", "")
editableDiffuseStage.updateTransformation(rotateIndex, dr.MaterialStage.TransformType.SCALE, "time*0.5", "0.5")
editableDiffuseStage.removeTransformation(rotateIndex)
editableDiffuseStage.setColourExpressionFromString(dr.MaterialStage.ColourComponent.RGB, "0.4*time")
editableDiffuseStage.setConditionExpressionFromString("parm4 > 7")
editableDiffuseStage.setTexGenType(dr.MaterialStage.TexGenType.REFLECT)
editableDiffuseStage.setTexGenType(dr.MaterialStage.TexGenType.WOBBLESKY)
editableDiffuseStage.setTexGenExpressionFromString(0, "0.1")
editableDiffuseStage.setTexGenExpressionFromString(1, "0.2")
editableDiffuseStage.setTexGenExpressionFromString(2, "0.3")
for stage in newMaterial.getAllStages():
print('Stage type: {0}'.format(stage.getType()))
print('Stage map type: {0}'.format(stage.getMapType()))
print('Stage map expression: {0}'.format(stage.getMapExpressionString()))
print('Stage flags: {0}'.format(stage.getStageFlags()))
print('Stage clamp type: {0}'.format(stage.getClampType()))
print('Stage texgen type: {0}'.format(stage.getTexGenType()))
print('Stage texgen expression #1: {0}'.format(stage.getTexGenExpressionString(0)))
print('Stage blend func strings: {0},{1}'.format(stage.getBlendFuncStrings()[0], stage.getBlendFuncStrings()[1]))
print('Stage colour expression RED: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.RED)))
print('Stage colour expression GREEN: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.GREEN)))
print('Stage colour expression BLUE: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.BLUE)))
print('Stage colour expression ALPHA: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.ALPHA)))
print('Stage colour expression RGB: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.RGB)))
print('Stage colour expression RGBA: {0}'.format(stage.getColourExpressionString(dr.MaterialStage.ColourComponent.RGBA)))
print('Stage vertex colour mode: {0}'.format(stage.getVertexColourMode()))
print('Stage render map size: {0}'.format(stage.getRenderMapSize()))
print('Stage alpha test expression: {0}'.format(stage.getAlphaTestExpressionString()))
print('Stage condition expression: {0}'.format(stage.getConditionExpressionString()))
print('Stage vertex program: {0}'.format(stage.getVertexProgram()))
print('Stage fragment program: {0}'.format(stage.getFragmentProgram()))
print('Stage has {0} vertex parameters and {1} fragment maps'.format(stage.getNumVertexParms(), stage.getNumFragmentMaps()))
print('Stage private polygon offset: {0}'.format(stage.getPrivatePolygonOffset()))
for transform in stage.getTransformations():
print('Stage transform type: {0}'.format(transform.type))
print('Stage transform expression1: {0}'.format(transform.expression1))
print('Stage transform expression2: {0}'.format(transform.expression2))
for v in range(0, stage.getNumVertexParms()):
parm = stage.getVertexParm(v)
print('Stage Vertex Parm #{0}: {1}'.format(parm.index, ' '.join(parm.expressions)))
for f in range(0, stage.getNumFragmentMaps()):
fm = stage.getFragmentMap(f)
print('Stage Fragment Map #{0}: {1} {2}'.format(fm.index, ' '.join(fm.options), fm.mapExpression))
newMaterial.swapStagePosition(diffuseStageIndex, bumpStageIndex)
print("The new material has been modified" if newMaterial.isModified() else "The new material is not modified?")
print('\n\nFull Material definition:\n{0}\n{{{1}}}\n\n'.format(newMaterial.getName(), newMaterial.getDefinition()))
GlobalMaterialManager.saveMaterial(newMaterial.getName())
print("After save, the material is not modified" if not newMaterial.isModified() else "After save, the material is still modified?")
newMaterial.clearMaterialFlag(dr.Material.Flag.NOSHADOWS)
newMaterial.clearSurfaceFlag(dr.Material.SurfaceFlag.NONSOLID)
newMaterial.setSurfaceType(dr.Material.SurfaceType.DEFAULT)
fullPath = GlobalFileSystem.findFile(filename) + filename
print(fullPath)
os.remove(fullPath)
print("Removing {0} again...".format(newMaterial.getName()))
GlobalMaterialManager.removeMaterial(newMaterial.getName())
print('--- Done ---')