Forward.cpp 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /******************************************************************************/
  2. #include "!Header.h"
  3. #include "Ambient Occlusion.h"
  4. /******************************************************************************/
  5. #define PARAMS \
  6. uniform Bool skin ,\
  7. uniform Int materials ,\
  8. uniform Int textures ,\
  9. uniform Int bump_mode ,\
  10. uniform Bool alpha_test ,\
  11. uniform Bool light_map ,\
  12. uniform Bool detail ,\
  13. uniform Bool rflct ,\
  14. uniform Bool color ,\
  15. uniform Bool mtrl_blend ,\
  16. uniform Bool heightmap ,\
  17. uniform Int fx ,\
  18. \
  19. uniform Bool light_dir ,\
  20. uniform Bool light_dir_shd ,\
  21. uniform Int light_dir_shd_num,\
  22. \
  23. uniform Bool light_point ,\
  24. uniform Bool light_point_shd ,\
  25. \
  26. uniform Bool light_sqr ,\
  27. uniform Bool light_sqr_shd ,\
  28. \
  29. uniform Bool light_cone ,\
  30. uniform Bool light_cone_shd ,\
  31. \
  32. uniform Bool tesselate
  33. /******************************************************************************/
  34. struct VS_PS
  35. {
  36. Vec2 tex :TEXCOORD0;
  37. Vec pos :TEXCOORD1;
  38. Matrix3 mtrx :TEXCOORD2; // !! may not be Normalized !!
  39. Vec rfl :TEXCOORD6;
  40. Vec2 tex_l :TEXCOORD7;
  41. Half fade_out:TEXCOORD5;
  42. VecH col :COLOR0 ;
  43. VecH4 material:COLOR1 ;
  44. };
  45. /******************************************************************************/
  46. // VS
  47. /******************************************************************************/
  48. void VS
  49. (
  50. VtxInput vtx,
  51. out VS_PS O,
  52. out Vec4 O_vtx:POSITION,
  53. IF_IS_CLIP
  54. PARAMS
  55. )
  56. {
  57. Vec pos=vtx.pos();
  58. VecH nrm, tan; if(bump_mode>=SBUMP_FLAT)nrm=vtx.nrm(); if(bump_mode>SBUMP_FLAT)tan=vtx.tan(nrm, heightmap);
  59. if(textures || detail)O.tex =vtx.tex (heightmap);
  60. if(light_map )O.tex_l =vtx.tex1 ();
  61. if(materials>1 )O.material=vtx.material();
  62. if(materials<=1)O.col.rgb=MaterialColor3();/*else
  63. if(!mtrl_blend )
  64. {
  65. O.col.rgb =O.material.x*MultiMaterial0Color3()
  66. +O.material.y*MultiMaterial1Color3();
  67. if(materials>=3)O.col.rgb+=O.material.z*MultiMaterial2Color3();
  68. if(materials>=4)O.col.rgb+=O.material.w*MultiMaterial3Color3();
  69. }*/
  70. if(color)
  71. {
  72. if(materials<=1/* || !mtrl_blend*/)O.col.rgb*=vtx.color3();
  73. else O.col.rgb =vtx.color3();
  74. }
  75. if(heightmap && textures && materials==1)O.tex*=MaterialTexScale();
  76. if(fx==FX_LEAF)
  77. {
  78. if(bump_mode> SBUMP_FLAT)BendLeaf(vtx.hlp(), pos, nrm, tan);else
  79. if(bump_mode==SBUMP_FLAT)BendLeaf(vtx.hlp(), pos, nrm );else
  80. BendLeaf(vtx.hlp(), pos );
  81. }
  82. if(fx==FX_LEAFS)
  83. {
  84. if(bump_mode> SBUMP_FLAT)BendLeafs(vtx.hlp(), vtx.size(), pos, nrm, tan);else
  85. if(bump_mode==SBUMP_FLAT)BendLeafs(vtx.hlp(), vtx.size(), pos, nrm );else
  86. BendLeafs(vtx.hlp(), vtx.size(), pos );
  87. }
  88. if(!skin)
  89. {
  90. #if MODEL>=SM_4 || MODEL==SM_GL
  91. if(true) // instance
  92. {
  93. O.pos=TransformPos(pos, vtx.instance());
  94. if(bump_mode>=SBUMP_FLAT)O.mtrx[2]=TransformDir(nrm, vtx.instance());
  95. if(bump_mode> SBUMP_FLAT)O.mtrx[0]=TransformDir(tan, vtx.instance());
  96. if(fx==FX_GRASS)
  97. {
  98. BendGrass(pos, O.pos, vtx.instance());
  99. O.fade_out=GrassFadeOut(vtx.instance());
  100. }
  101. }else
  102. #endif
  103. {
  104. O.pos=TransformPos(pos);
  105. if(bump_mode>=SBUMP_FLAT)O.mtrx[2]=TransformDir(nrm);
  106. if(bump_mode> SBUMP_FLAT)O.mtrx[0]=TransformDir(tan);
  107. if(fx==FX_GRASS)
  108. {
  109. BendGrass(pos, O.pos);
  110. O.fade_out=GrassFadeOut();
  111. }
  112. }
  113. CLIP(O.pos);
  114. }else
  115. {
  116. VecI bone=vtx.bone();
  117. O.pos=TransformPos(pos, bone, vtx.weight()); CLIP(O.pos);
  118. if(bump_mode>=SBUMP_FLAT)O.mtrx[2]=TransformDir(nrm, bone, vtx.weight());
  119. if(bump_mode> SBUMP_FLAT)O.mtrx[0]=TransformDir(tan, bone, vtx.weight());
  120. }
  121. // normalize (have to do all at the same time, so all have the same lengths)
  122. if(bump_mode>SBUMP_FLAT // calculating binormal (this also covers the case when we have tangent from heightmap which is not Normalized)
  123. || rflct && bump_mode==SBUMP_FLAT // calculating per-vertex reflection
  124. || tesselate) // needed for tesselation
  125. {
  126. O.mtrx[2]=Normalize(O.mtrx[2]);
  127. if(bump_mode>SBUMP_FLAT)O.mtrx[0]=Normalize(O.mtrx[0]);
  128. }
  129. if(bump_mode>SBUMP_FLAT)O.mtrx[1]=vtx.bin(O.mtrx[2], O.mtrx[0], heightmap);
  130. if(rflct && bump_mode==SBUMP_FLAT)O.rfl=Transform3(reflect(Normalize(O.pos), O.mtrx[2]), CamMatrix);
  131. O_vtx=Project(O.pos);
  132. }
  133. /******************************************************************************/
  134. // PS
  135. /******************************************************************************/
  136. Vec4 PS
  137. (
  138. VS_PS I,
  139. PIXEL,
  140. IF_IS_FRONT
  141. PARAMS
  142. ):COLOR
  143. {
  144. Bool secondary=(light_point || light_sqr || light_cone); // local lights are enabled only for secondary shader passes
  145. VecH nrm;
  146. Half glow, specular, sss;
  147. if(bump_mode==SBUMP_ZERO)
  148. {
  149. nrm =0;
  150. glow =MaterialGlow();
  151. specular=0;
  152. sss =0;
  153. light_dir =false;
  154. light_point=false;
  155. light_sqr =false;
  156. light_cone =false;
  157. }else
  158. if(materials==1)
  159. {
  160. VecH4 tex_nrm; // #MaterialTextureChannelOrder
  161. if(textures==0)
  162. {
  163. Half tex_col=1; if(detail)tex_col+=GetDetail(I.tex).z; I.col.rgb*=tex_col;
  164. nrm =Normalize(I.mtrx[2]);
  165. glow =MaterialGlow ();
  166. specular=MaterialSpecular();
  167. }else
  168. if(textures==1)
  169. {
  170. VecH4 tex_col=Tex(Col, I.tex); if(alpha_test)AlphaTest(tex_col.w, I.fade_out, fx);
  171. nrm =Normalize(I.mtrx[2]);
  172. glow =MaterialGlow ();
  173. specular=MaterialSpecular();
  174. if(detail)tex_col.rgb+=GetDetail(I.tex).z; I.col.rgb*=tex_col.rgb;
  175. }else
  176. if(textures==2)
  177. {
  178. tex_nrm =Tex(Nrm, I.tex) ; if( alpha_test)AlphaTest(tex_nrm.a, I.fade_out, fx); // #MaterialTextureChannelOrder
  179. glow =MaterialGlow (); if(!alpha_test)glow*=tex_nrm.a;
  180. specular =MaterialSpecular()*tex_nrm.z;
  181. if(bump_mode==SBUMP_FLAT)
  182. {
  183. nrm=Normalize(I.mtrx[2]);
  184. VecH tex_col=Tex(Col, I.tex).rgb; if(detail)tex_col+=GetDetail(I.tex).z; I.col.rgb*=tex_col;
  185. }else // normal mapping
  186. {
  187. VecH det;
  188. if(detail)det=GetDetail(I.tex);
  189. nrm.xy =(tex_nrm.xy*2-1)*MaterialRough();
  190. if(detail)nrm.xy+=det.xy;
  191. nrm.z =CalcZ(nrm.xy);
  192. nrm =Normalize(Transform(nrm, I.mtrx));
  193. VecH tex_col=Tex(Col, I.tex).rgb; if(detail)tex_col+=det.z; I.col.rgb*=tex_col;
  194. }
  195. }
  196. if(light_map)I.col.rgb*=Tex(Lum, I.tex_l).rgb;
  197. sss=MaterialSss();
  198. // reflection
  199. if(rflct)
  200. {
  201. if(bump_mode>SBUMP_FLAT)I.rfl=Transform3(reflect(I.pos, nrm), CamMatrix);
  202. I.col.rgb+=TexCube(Rfl, I.rfl).rgb*((textures==2) ? MaterialReflect()*tex_nrm.z : MaterialReflect());
  203. }
  204. }else // materials>1
  205. {
  206. // assuming that in multi materials textures!=0
  207. Vec2 tex0, tex1, tex2, tex3;
  208. tex0=I.tex*MultiMaterial0TexScale();
  209. tex1=I.tex*MultiMaterial1TexScale();
  210. if(materials>=3)tex2=I.tex*MultiMaterial2TexScale();
  211. if(materials>=4)tex3=I.tex*MultiMaterial3TexScale();
  212. // color !! do this first because it may modify 'I.material' which affects secondary texture !!
  213. VecH tex;
  214. if(mtrl_blend)
  215. {
  216. VecH4 col0, col1, col2, col3;
  217. col0=Tex(Col , tex0); col0.rgb*=MultiMaterial0Color3(); I.material.x=MultiMaterialWeight(I.material.x, col0.a);
  218. col1=Tex(Col1, tex1); col1.rgb*=MultiMaterial1Color3(); I.material.y=MultiMaterialWeight(I.material.y, col1.a); if(materials==2)I.material.xy /=I.material.x+I.material.y;
  219. if(materials>=3){col2=Tex(Col2, tex2); col2.rgb*=MultiMaterial2Color3(); I.material.z=MultiMaterialWeight(I.material.z, col2.a); if(materials==3)I.material.xyz /=I.material.x+I.material.y+I.material.z;}
  220. if(materials>=4){col3=Tex(Col3, tex3); col3.rgb*=MultiMaterial3Color3(); I.material.w=MultiMaterialWeight(I.material.w, col3.a); if(materials==4)I.material.xyzw/=I.material.x+I.material.y+I.material.z+I.material.w;}
  221. tex =I.material.x*col0.rgb
  222. +I.material.y*col1.rgb;
  223. if(materials>=3)tex+=I.material.z*col2.rgb;
  224. if(materials>=4)tex+=I.material.w*col3.rgb;
  225. }else
  226. {
  227. tex =I.material.x*Tex(Col , tex0).rgb*MultiMaterial0Color3()
  228. +I.material.y*Tex(Col1, tex1).rgb*MultiMaterial1Color3();
  229. if(materials>=3)tex+=I.material.z*Tex(Col2, tex2).rgb*MultiMaterial2Color3();
  230. if(materials>=4)tex+=I.material.w*Tex(Col3, tex3).rgb*MultiMaterial3Color3();
  231. }
  232. if(materials<=1 /*|| !mtrl_blend*/ || color)I.col.rgb*=tex;
  233. else I.col.rgb =tex;
  234. // normal, specular, glow !! do this second after modifying 'I.material' !!
  235. if(textures<=1)
  236. {
  237. nrm=Normalize(I.mtrx[2]);
  238. VecH2 tex =I.material.x*MultiMaterial0NormalAdd().zw // #MaterialTextureChannelOrder
  239. +I.material.y*MultiMaterial1NormalAdd().zw;
  240. if(materials>=3)tex+=I.material.z*MultiMaterial2NormalAdd().zw;
  241. if(materials>=4)tex+=I.material.w*MultiMaterial3NormalAdd().zw;
  242. specular=tex.x;
  243. glow =tex.y;
  244. // reflection
  245. if(rflct)
  246. {
  247. if(bump_mode>SBUMP_FLAT)I.rfl=Transform3(reflect(I.pos, nrm), CamMatrix);
  248. I.col.rgb+=TexCube(Rfl , I.rfl).rgb*(MultiMaterial0Reflect()*I.material.x);
  249. I.col.rgb+=TexCube(Rfl1, I.rfl).rgb*(MultiMaterial1Reflect()*I.material.y);
  250. if(materials>=3)I.col.rgb+=TexCube(Rfl2, I.rfl).rgb*(MultiMaterial2Reflect()*I.material.z);
  251. if(materials>=4)I.col.rgb+=TexCube(Rfl3, I.rfl).rgb*(MultiMaterial3Reflect()*I.material.w);
  252. }
  253. }else
  254. {
  255. Half tex_spec[4];
  256. if(bump_mode==SBUMP_FLAT)
  257. {
  258. nrm=Normalize(I.mtrx[2]);
  259. VecH2 tex; // #MaterialTextureChannelOrder
  260. {VecH2 nrm0; nrm0=Tex(Nrm , tex0).zw; if(rflct)tex_spec[0]=nrm0.x; nrm0=nrm0*MultiMaterial0NormalMul().zw+MultiMaterial0NormalAdd().zw; tex =I.material.x*nrm0;}
  261. {VecH2 nrm1; nrm1=Tex(Nrm1, tex1).zw; if(rflct)tex_spec[1]=nrm1.x; nrm1=nrm1*MultiMaterial1NormalMul().zw+MultiMaterial1NormalAdd().zw; tex+=I.material.y*nrm1;}
  262. if(materials>=3){VecH2 nrm2; nrm2=Tex(Nrm2, tex2).zw; if(rflct)tex_spec[2]=nrm2.x; nrm2=nrm2*MultiMaterial2NormalMul().zw+MultiMaterial2NormalAdd().zw; tex+=I.material.z*nrm2;}
  263. if(materials>=4){VecH2 nrm3; nrm3=Tex(Nrm3, tex3).zw; if(rflct)tex_spec[3]=nrm3.x; nrm3=nrm3*MultiMaterial3NormalMul().zw+MultiMaterial3NormalAdd().zw; tex+=I.material.w*nrm3;}
  264. specular=tex.x;
  265. glow =tex.y;
  266. }else // normal mapping
  267. {
  268. VecH4 tex; // #MaterialTextureChannelOrder
  269. {VecH4 nrm0=Tex(Nrm , tex0); if(rflct)tex_spec[0]=nrm0.z; nrm0=nrm0*MultiMaterial0NormalMul()+MultiMaterial0NormalAdd(); tex =I.material.x*nrm0;}
  270. {VecH4 nrm1=Tex(Nrm1, tex1); if(rflct)tex_spec[1]=nrm1.z; nrm1=nrm1*MultiMaterial1NormalMul()+MultiMaterial1NormalAdd(); tex+=I.material.y*nrm1;}
  271. if(materials>=3){VecH4 nrm2=Tex(Nrm2, tex2); if(rflct)tex_spec[2]=nrm2.z; nrm2=nrm2*MultiMaterial2NormalMul()+MultiMaterial2NormalAdd(); tex+=I.material.z*nrm2;}
  272. if(materials>=4){VecH4 nrm3=Tex(Nrm3, tex3); if(rflct)tex_spec[3]=nrm3.z; nrm3=nrm3*MultiMaterial3NormalMul()+MultiMaterial3NormalAdd(); tex+=I.material.w*nrm3;}
  273. nrm=VecH(tex.xy, CalcZ(tex.xy));
  274. nrm=Normalize(Transform(nrm, I.mtrx));
  275. specular=tex.z;
  276. glow =tex.w;
  277. }
  278. // reflection
  279. if(rflct)
  280. {
  281. if(bump_mode>SBUMP_FLAT)I.rfl=Transform3(reflect(I.pos, nrm), CamMatrix);
  282. I.col.rgb+=TexCube(Rfl , I.rfl).rgb*(MultiMaterial0Reflect()*I.material.x*tex_spec[0]);
  283. I.col.rgb+=TexCube(Rfl1, I.rfl).rgb*(MultiMaterial1Reflect()*I.material.y*tex_spec[1]);
  284. if(materials>=3)I.col.rgb+=TexCube(Rfl2, I.rfl).rgb*(MultiMaterial2Reflect()*I.material.z*tex_spec[2]);
  285. if(materials>=4)I.col.rgb+=TexCube(Rfl3, I.rfl).rgb*(MultiMaterial3Reflect()*I.material.w*tex_spec[3]);
  286. }
  287. }
  288. sss=0;
  289. }
  290. if(fx!=FX_GRASS && fx!=FX_LEAF && fx!=FX_LEAFS)BackFlip(nrm, front);
  291. // lighting
  292. VecH total_lum,
  293. total_specular=0;
  294. if(bump_mode==SBUMP_ZERO )total_lum =1;
  295. else total_lum =AmbColor;
  296. if(materials<=1 && !secondary)total_lum+=MaterialAmbient()*AmbMaterial; // ambient values are always disabled for secondary passes (so don't bother adding them)
  297. VecH2 jitter_value;
  298. if(light_dir_shd || light_point_shd || light_sqr_shd || light_cone_shd)jitter_value=ShadowJitter(pixel.xy);
  299. if(light_dir)
  300. {
  301. // shadow
  302. Half shadow; if(light_dir_shd)shadow=Sat(ShadowDirValue(I.pos, jitter_value, true, light_dir_shd_num, false));
  303. // diffuse
  304. VecH light_dir=Light_dir.dir;
  305. Half lum =LightDiffuse(nrm, light_dir); if(light_dir_shd)lum*=shadow;
  306. // specular
  307. #if MODEL>=SM_4
  308. BRANCH if(lum*specular>EPS_COL)
  309. #endif
  310. {
  311. VecH eye_dir=Normalize (-I.pos);
  312. Half spec =LightSpecular( nrm, specular, light_dir, eye_dir); if(light_dir_shd)spec*=shadow;
  313. total_specular+=Light_dir.color.rgb*spec;
  314. } total_lum +=Light_dir.color.rgb*lum ;
  315. }
  316. if(light_point)
  317. {
  318. // shadow
  319. Half shadow; if(light_point_shd)shadow=ShadowFinal(ShadowPointValue(I.pos, jitter_value, true));
  320. // distance
  321. VecH light_dir=Light_point.pos-I.pos;
  322. Half power =LightPointDist(light_dir); if(light_point_shd)power*=shadow;
  323. // diffuse
  324. light_dir=Normalize (light_dir);
  325. Half lum =LightDiffuse(nrm, light_dir);
  326. // specular
  327. #if MODEL>=SM_4
  328. BRANCH if(lum*specular>EPS_COL)
  329. #endif
  330. {
  331. VecH eye_dir=Normalize (-I.pos);
  332. Half spec =LightSpecular( nrm, specular, light_dir, eye_dir);
  333. total_specular+=Light_point.color.rgb*(spec*power);
  334. } total_lum +=Light_point.color.rgb*(lum *power);
  335. }
  336. if(light_sqr)
  337. {
  338. // shadow
  339. Half shadow; if(light_sqr_shd)shadow=ShadowFinal(ShadowPointValue(I.pos, jitter_value, true));
  340. // distance
  341. VecH light_dir=Light_sqr.pos-I.pos;
  342. Half power =LightSqrDist(light_dir); if(light_sqr_shd)power*=shadow;
  343. // diffuse
  344. light_dir=Normalize (light_dir);
  345. Half lum =LightDiffuse(nrm, light_dir);
  346. // specular
  347. #if MODEL>=SM_4
  348. BRANCH if(lum*specular>EPS_COL)
  349. #endif
  350. {
  351. VecH eye_dir=Normalize (-I.pos);
  352. Half spec =LightSpecular( nrm, specular, light_dir, eye_dir);
  353. total_specular+=Light_sqr.color.rgb*(spec*power);
  354. } total_lum +=Light_sqr.color.rgb*(lum *power);
  355. }
  356. if(light_cone)
  357. {
  358. // shadow
  359. Half shadow; if(light_cone_shd)shadow=ShadowFinal(ShadowConeValue(I.pos, jitter_value, true));
  360. // distance & angle
  361. VecH light_dir=Light_cone.pos-I.pos,
  362. dir =mul(Light_cone.mtrx, light_dir); dir.xy/=dir.z; // clip(Vec(1-Abs(dir.xy), dir.z));
  363. Half power =LightConeAngle(dir.xy)*LightConeDist(light_dir); if(light_cone_shd)power*=shadow; power*=(dir.z>0);
  364. // diffuse
  365. light_dir=Normalize (light_dir);
  366. Half lum =LightDiffuse(nrm, light_dir);
  367. // specular
  368. #if MODEL>=SM_4
  369. BRANCH if(lum*specular>EPS_COL)
  370. #endif
  371. {
  372. VecH eye_dir=Normalize (-I.pos);
  373. Half spec =LightSpecular( nrm, specular, light_dir, eye_dir);
  374. total_specular+=Light_cone.color.rgb*(spec*power);
  375. } total_lum +=Light_cone.color.rgb*(lum *power);
  376. }
  377. UpdateColorBySss(I.col.rgb, nrm, sss);
  378. I.col.rgb=(I.col.rgb+Highlight.rgb)*total_lum + total_specular;
  379. return Vec4(I.col.rgb, glow);
  380. }
  381. /******************************************************************************/
  382. // HULL / DOMAIN
  383. /******************************************************************************/
  384. #if MODEL>=SM_4
  385. HSData HSConstant(InputPatch<VS_PS,3> I) {return GetHSData(I[0].pos, I[1].pos, I[2].pos, I[0].mtrx[2], I[1].mtrx[2], I[2].mtrx[2]);}
  386. [maxtessfactor(5.0)]
  387. [domain("tri")]
  388. [partitioning("fractional_odd")] // use 'odd' because it supports range from 1.0 ('even' supports range from 2.0)
  389. [outputtopology("triangle_cw")]
  390. [patchconstantfunc("HSConstant")]
  391. [outputcontrolpoints(3)]
  392. VS_PS HS
  393. (
  394. InputPatch<VS_PS,3> I, UInt cp_id:SV_OutputControlPointID,
  395. PARAMS
  396. )
  397. {
  398. VS_PS O;
  399. O.pos =I[cp_id].pos ;
  400. if(materials<=1 /*|| !mtrl_blend*/ || color)O.col =I[cp_id].col ;
  401. if(textures || detail )O.tex =I[cp_id].tex ;
  402. if(light_map )O.tex_l =I[cp_id].tex_l ;
  403. if(rflct && bump_mode==SBUMP_FLAT )O.rfl =I[cp_id].rfl ;
  404. if(materials>1 )O.material=I[cp_id].material;
  405. if(fx==FX_GRASS )O.fade_out=I[cp_id].fade_out;
  406. if(bump_mode==SBUMP_FLAT )O.mtrx[2] =I[cp_id].mtrx[2] ;
  407. if(bump_mode> SBUMP_FLAT )O.mtrx =I[cp_id].mtrx ;
  408. return O;
  409. }
  410. /******************************************************************************/
  411. [domain("tri")]
  412. void DS
  413. (
  414. HSData hs_data, const OutputPatch<VS_PS,3> I, Vec B:SV_DomainLocation,
  415. out VS_PS O,
  416. out Vec4 O_vtx:POSITION,
  417. PARAMS
  418. )
  419. {
  420. if(materials<=1 /*|| !mtrl_blend*/ || color)O.col =I[0].col *B.z + I[1].col *B.x + I[2].col *B.y;
  421. if(textures || detail )O.tex =I[0].tex *B.z + I[1].tex *B.x + I[2].tex *B.y;
  422. if(light_map )O.tex_l =I[0].tex_l *B.z + I[1].tex_l *B.x + I[2].tex_l *B.y;
  423. if(rflct && bump_mode==SBUMP_FLAT )O.rfl =I[0].rfl *B.z + I[1].rfl *B.x + I[2].rfl *B.y;
  424. if(materials>1 )O.material=I[0].material*B.z + I[1].material*B.x + I[2].material*B.y;
  425. if(fx==FX_GRASS )O.fade_out=I[0].fade_out*B.z + I[1].fade_out*B.x + I[2].fade_out*B.y;
  426. if(bump_mode>SBUMP_FLAT)
  427. {
  428. O.mtrx[0]=I[0].mtrx[0]*B.z + I[1].mtrx[0]*B.x + I[2].mtrx[0]*B.y;
  429. O.mtrx[1]=I[0].mtrx[1]*B.z + I[1].mtrx[1]*B.x + I[2].mtrx[1]*B.y;
  430. //mtrx[2] is handled below
  431. }
  432. SetDSPosNrm(O.pos, O.mtrx[2], I[0].pos, I[1].pos, I[2].pos, I[0].mtrx[2], I[1].mtrx[2], I[2].mtrx[2], B, hs_data, false, 0);
  433. O_vtx=Project(O.pos);
  434. }
  435. #endif
  436. /******************************************************************************/
  437. // TECHNIQUES
  438. /******************************************************************************/
  439. CUSTOM_TECHNIQUE
  440. /******************************************************************************/