Skip to content
Permalink
master
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
 
 
Cannot retrieve contributors at this time
// This file is distributed under a BSD license. See LICENSE.txt for details.
ps.1.1
// constants / flag data layout
def c5,2,-1,0,0
def c6,0.5,-0.5,0,1
def c7,1,0,0,0.5
flags
BaseFlags
SpecialFlags
LightFlags
CodegenFlags
TFlags[4]
Combiner[13]
_pad[2]
AlphaCombiner
TexUsed[4]
AlphaOps[2]
CombinerSrc[13]
AlphaSrc[13]
endflags
// yes, this is rather hackish
temp r0,r1
// read textures used in combiners
for i = 0..3
if TexUsed[i][0]
tex t0+i1
iadd i1,1
iadd i2,1
endif
endfor
// read cube normalizers for lighting
if LightFlags[0..2] == 5 // bumpx
// texture reads
tex t0+i1 // light
iadd i1,1
if !SpecialFlags[6] // specular?
tex t0+i1 // halfway
iadd i1,1
endif
tex t0+i1 // attenuation
iadd i1,1
// bump shader
temp normal
if TexUsed[1][0]
vmov normal,t0
else
vmov normal,c7
endif
if SpecialFlags[6] // diffuse only
dp3_sat r0.xyz,t0+i2_bx2,normal // 1 diffuse dot
+mov r0.w,c5 // 1 clear alpha
mul r1.xyz,t1+i2,c0 // 2 attenuation*light color
mul r0.xyz,r0,r1 // 3 final diffuse
else // diffuse and specular
dp3_sat r0.xyz,t1+i2_bx2,normal // 1 specular dot
+mul r0.w,c0,t2+i2 // 1 attenuation*light color
dp3_sat r1.xyz,t0+i2_bx2,normal // 2 diffuse dot
+mad_x4_sat r1.w,r0.z,c1.z,c1.w // 2 specular pow 1
mul r0.xyz,c0,t2+i2 // 3 attenuation*light color
+mul_x2 r1.w,r1,r1 // 3 specular pow 2
mul_x2 t0+i2.xyz,r1.w,r1.w // 4 specular pow 3
// one free alpha operation here
mul_x2_sat t0+i2.xyz,t0+i2,t0+i2 // 5 specular pow 4
if SpecialFlags[7] // specular map?
+mul r0.w,r0,t0 // 5 gloss map
endif
mul r0.xyz,r0,r1 // 6 final diffuse
+mul r0.w,t0+i2.z,r0.w // 6 final specular
endif
else // combiner
imov i2,0 // "last was set" flag
for i = 0..12 // combiner code!
temp src,asrc,rsrc
vmov src,CombinerSrc[i]
vmov asrc,AlphaSrc[i]
imov i3,0 // instruction already generated during alpha fade
if Combiner[i][0..3] // alpha fade
if Combiner[i][4..7] == 9 // lerp, do nothing
elif Combiner[i][4..7] == 1 // set, change destination
mul r0.xyz,src,asrc
imov i3,1
elif Combiner[i][4..7] == 2 // add, generate mad
mad r0.xyz,src,asrc,r0
imov i3,1
else
mul r1.xyz,src,asrc
vmov src,r1
endif
endif
if !i3
if Combiner[i][4..7] // combiner operation
imov i2,0
if Combiner[i][4..7] == 1 // set
vmov r0,src
imov i2,1
elif Combiner[i][4..7] == 2 // add
add r0.xyz,r0,src
elif Combiner[i][4..7] == 3 // sub
sub r0.xyz,r0,src
elif Combiner[i][4..7] == 4 // mul
mul r0.xyz,r0,src
elif Combiner[i][4..7] == 5 // mul2
mul_x2 r0.xyz,r0,src
elif Combiner[i][4..7] == 6 // mul4
mul_x4 r0.xyz,r0,src
elif Combiner[i][4..7] == 7 // mul8
mul_x4 r0.xyz,r0,src
add r0.xyz,r0,r0
elif Combiner[i][4..7] == 8 // smooth
mad r0.xyz,r0,1-src,src
elif Combiner[i][4..7] == 9 // lerp
lrp r0.xyz,asrc,r0,src
elif Combiner[i][4..7] == 10 // rsub
sub r0.xyz,src,r0
elif Combiner[i][4..7] == 11 // dp3
dp3 r0.xyz,r0,src
elif Combiner[i][4..7] == 12 // muls
mul_sat r0.xyz,r0,src
endif
endif
endif
endfor
if i2 // if last operation was a set, force a move
mov r0.xyz,r0
endif
// alpha combiner implementation
if AlphaCombiner[4..7] == 14 // mix01
+mul r0.w,t0,c0
mad r0.w,t1,c0,r0
elif AlphaCombiner[4..7] // two-alpha-setup
temp src0,src1
vmov src0,AlphaOps[0]
vmov src1,AlphaOps[1]
+mul r0.w,src0,src1
else
temp src
vmov src,AlphaOps[0]
+mov r0.w,src
endif
endif