Advertisement
Guest User

Untitled

a guest
Feb 25th, 2016
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.88 KB | None | 0 0
  1.  
  2. const int PROCSKY_STEP_UPDATE = 16;
  3. float timeToNextProcSkyUpdate = 0;
  4.  
  5.  
  6. int psParam = 256;
  7. float psFOV = 89.5f;
  8.  
  9. bool procSkyShow = true;
  10. Node@ procSkyNode;
  11. Node@ procSkyLightNode;
  12. Light@ procSkyLight;
  13. Color procSkyLightColor;
  14. Camera@ procSkyCamera;
  15. Skybox@ procSkySkyBox;
  16. Material@ procSkySkyBoxMaterial;
  17. TextureCube@ procSkyCubeTexture;
  18. RenderPath@ procSkyRenderPath;
  19.  
  20. int procSkyRenderSize = 256;
  21. int procSkyRenderSizeLast = 0;
  22. bool procSkyRenderQueued = false;
  23.  
  24. const int MAX_CUBEMAP_FACES = 6;
  25. Array<Matrix3> procSkyFaceRotations;
  26. Array<RenderPathCommand> cmd;
  27.  
  28. Vector3 Kr = Vector3(0.18867780436772762f, 0.4978442963618773f, 0.6616065586417131f); // Absorption profile of air.
  29. float rayleighBrightness = 3.3f;
  30. float mieBrightness = 0.1f;
  31. float spotBrightness = 50.0f;
  32. float scatterStrength = 0.028f;
  33. float rayleighStrength = 0.139f;
  34. float mieStrength = 0.264f;
  35. float rayleighCollectionPower = 0.81f;
  36. float mieCollectionPower = 0.39f;
  37. float mieDistribution = 0.63f;
  38.  
  39.  
  40.  
  41.  
  42. void CheckOrCreateProSkyStuff()
  43. {
  44. if (editorScene is null || procSkyNode is null) return;
  45.  
  46. if (procSkyCamera is null)
  47. {
  48. procSkyCamera = procSkyNode.CreateComponent("Camera");
  49. procSkyCamera.fov = psFOV;
  50. procSkyCamera.farClip = 100.0f;
  51. procSkyCamera.nearClip = 1.0f;
  52. procSkyCamera.aspectRatio = 1.0;
  53. }
  54.  
  55. if (procSkyLightNode is null)
  56. {
  57. procSkyLightNode = procSkyNode.CreateChild("ProcSkyLightNode");
  58. if (procSkyLight is null)
  59. {
  60. procSkyLight = procSkyLightNode.CreateComponent("Light");
  61. procSkyLight.lightType = LIGHT_DIRECTIONAL;
  62. procSkyLightColor.FromHSV(57.0f, 9.9f, 73.0f , 1.0);
  63. procSkyLight.color = procSkyLightColor;
  64. }
  65. }
  66.  
  67. if (procSkySkyBox is null)
  68. {
  69. procSkySkyBox = procSkyNode.CreateComponent("Skybox");
  70. procSkySkyBox.model = cache.GetResource("Model","Models/Box.mdl");
  71. procSkySkyBoxMaterial = Material();
  72. procSkySkyBoxMaterial.SetTechnique(0, cache.GetResource("Technique","Techniques/DiffSkybox.xml"));
  73. //procSkySkyBoxMaterial = cache.GetResource("Material","Materials/Skybox.xml");
  74. procSkySkyBoxMaterial.cullMode = CULL_NONE;
  75. procSkySkyBox.material = procSkySkyBoxMaterial;
  76.  
  77. }
  78.  
  79. if (procSkyRenderSizeLast != procSkyRenderSize)
  80. if (SetRenderSize(procSkyRenderSize))
  81. procSkyRenderSizeLast = procSkyRenderSize;
  82.  
  83. if (procSkyFaceRotations.length < MAX_CUBEMAP_FACES)
  84. {
  85. procSkyFaceRotations.Resize(MAX_CUBEMAP_FACES);
  86. procSkyFaceRotations[FACE_POSITIVE_X] = Matrix3(0,0,1, 0,1,0, -1,0,0);
  87. procSkyFaceRotations[FACE_NEGATIVE_X] = Matrix3(0,0,-1, 0,1,0, 1,0,0);
  88. procSkyFaceRotations[FACE_POSITIVE_Y] = Matrix3(1,0,0, 0,0,1, 0,-1,0);
  89. procSkyFaceRotations[FACE_NEGATIVE_Y] = Matrix3(1,0,0, 0,0,-1, 0,1,0);
  90. procSkyFaceRotations[FACE_POSITIVE_Z] = Matrix3(1,0,0, 0,1,0, 0,0,1);
  91. procSkyFaceRotations[FACE_NEGATIVE_Z] = Matrix3(-1,0,0, 0,1,0, 0,0,-1);
  92. }
  93.  
  94. Array<int> map;
  95. map.Resize(MAX_CUBEMAP_FACES);
  96. map[0] = FACE_POSITIVE_X;
  97. map[1] = FACE_POSITIVE_X;
  98. map[2] = FACE_POSITIVE_X;
  99. map[3] = FACE_POSITIVE_X;
  100. map[4] = FACE_POSITIVE_X;
  101. map[5] = FACE_POSITIVE_X;
  102.  
  103.  
  104.  
  105. VariantMap atmoParams;
  106. atmoParams["Kr"] = Kr;
  107. atmoParams["RayleighBrightness"] = rayleighBrightness;
  108. atmoParams["MieBrightness"] = mieBrightness;
  109. atmoParams["SpotBrightness"] = spotBrightness;
  110. atmoParams["ScatterStrength"] = scatterStrength;
  111. atmoParams["RayleighStrength"] = rayleighStrength;
  112. atmoParams["MieStrength"] = mieStrength;
  113. atmoParams["RayleighCollectionPower"] = rayleighCollectionPower;
  114. atmoParams["MieCollectionPower"] = mieCollectionPower;
  115. atmoParams["MieDistribution"] = mieDistribution;
  116. atmoParams["LightDir"] = Vector3(0.0f,-1.0f, 0.0f);
  117. atmoParams["InvProj"] = procSkyCamera.projection.Inverse();
  118.  
  119.  
  120.  
  121. //Array<String> s;
  122. cmd.Resize(MAX_CUBEMAP_FACES);
  123. for (int i = 0; i < MAX_CUBEMAP_FACES; ++i)
  124. {
  125. cmd[i].enabled = true;
  126. cmd[i].blendMode = BLEND_REPLACE;
  127. cmd[i].tag = "ProcSky";
  128. cmd[i].type = CMD_QUAD;
  129. cmd[i].sortMode = SORT_BACKTOFRONT;
  130. cmd[i].pass = "postopaque";
  131. //cmd[i].numOutputs = 1;
  132. //cmd[i].outputFaces["DiffProcSky"] = i;
  133. cmd[i].SetOutput(0, "DiffProcSky", CubeMapFace(i));
  134. //cmd[i].textureNames[0] = String("");
  135. cmd[i].vertexShaderName = "ProcSky";
  136. cmd[i].vertexShaderDefines = "";
  137. cmd[i].pixelShaderName = "ProcSky";
  138. cmd[i].pixelShaderDefines = "";
  139.  
  140. cmd[i].shaderParameters["Kr"] = atmoParams["Kr"];
  141. cmd[i].shaderParameters["RayleighBrightness"] = atmoParams["RayleighBrightness"];
  142. cmd[i].shaderParameters["MieBrightness"] = atmoParams["MieBrightness"];
  143. cmd[i].shaderParameters["SpotBrightness"] = atmoParams["SpotBrightness"];
  144. cmd[i].shaderParameters["ScatterStrength"] = atmoParams["ScatterStrength"];
  145. cmd[i].shaderParameters["RayleighStrength"] = atmoParams["RayleighStrength"];
  146. cmd[i].shaderParameters["MieStrength"] = atmoParams["MieStrength"];
  147. cmd[i].shaderParameters["RayleighCollectionPower"] = atmoParams["RayleighCollectionPower"];
  148. cmd[i].shaderParameters["MieDistribution"] = atmoParams["MieDistribution"];
  149. cmd[i].shaderParameters["LightDir"] = atmoParams["LightDir"];
  150. cmd[i].shaderParameters["InvProj"] = atmoParams["InvProj"];
  151.  
  152. cmd[i].shaderParameters["InvViewRot"] = Variant(procSkyFaceRotations[i]);
  153.  
  154. procSkyRenderPath.AddCommand(cmd[i]);
  155. }
  156.  
  157. }
  158.  
  159. bool SetRenderSize(int size)
  160. {
  161. if (size >= 1)
  162. {
  163. procSkyCubeTexture = TextureCube();
  164. procSkyCubeTexture.name = "DiffProcSky";
  165. procSkyCubeTexture.SetSize(size, GetRGBAFormat(), TEXTURE_RENDERTARGET);
  166. procSkyCubeTexture.filterMode = FILTER_BILINEAR;
  167. procSkyCubeTexture.addressMode[COORD_U] = ADDRESS_CLAMP;
  168. procSkyCubeTexture.addressMode[COORD_V] = ADDRESS_CLAMP;
  169. procSkyCubeTexture.addressMode[COORD_W] = ADDRESS_CLAMP;
  170. cache.AddManualResource(procSkyCubeTexture);
  171. if (procSkySkyBoxMaterial !is null )
  172. {
  173.  
  174. procSkySkyBoxMaterial.textures[TU_DIFFUSE] = procSkyCubeTexture;
  175. }
  176. procSkyRenderSize = size;
  177. return true;
  178. }
  179. else
  180. {
  181. MessageBox("1");
  182. // LOGWARNING("ProcSky::SetSize (" + String(size) + ") ignored; requires size >= 1.");
  183. }
  184. return false;
  185. }
  186.  
  187. void UpdateViewProcSky()
  188. {
  189. // Early out
  190. if (!procSkyShow) return;
  191.  
  192. if (editorScene is null || timeToNextProcSkyUpdate > time.systemTime) return;
  193.  
  194. procSkyNode = editorScene.GetChild("ProcSkyContainer", true);
  195.  
  196. // Get RenderPath
  197. if (procSkyRenderPath !is activeViewport.viewport.renderPath)
  198. {
  199. procSkyRenderPath = activeViewport.viewport.renderPath;
  200. //MessageBox("Get RenderPath");
  201. }
  202.  
  203. if (procSkyNode is null)
  204. {
  205. procSkyNode = editorScene.CreateChild("ProcSkyContainer", LOCAL);
  206. //procSkyNode.temporary = true;
  207. CheckOrCreateProSkyStuff();
  208. SetRenderQueued(true);
  209. }
  210.  
  211. // update
  212. UpdateShaderParameters();
  213.  
  214.  
  215. timeToNextProcSkyUpdate = time.systemTime + PROCSKY_STEP_UPDATE;
  216. }
  217.  
  218. void UpdateShaderParameters()
  219. {
  220. Vector3 lightDir;
  221. if (procSkyLightNode !is null)
  222. {
  223. lightDir = -procSkyLightNode.worldDirection;
  224. procSkyRenderPath.shaderParameters["LightDir"] = Variant(lightDir);
  225. }
  226.  
  227.  
  228. //for (int i = 0; i < MAX_CUBEMAP_FACES; ++i)
  229. //{
  230. // cmd[i].shaderParameters["LightDir"] = Variant(lightDir);
  231. // cmd[i].shaderParameters["Kr"] = Variant(Kr);
  232. // cmd[i].shaderParameters["RayleighBrightness"] = Variant(rayleighBrightness);
  233. // cmd[i].shaderParameters["MieBrightness"] = Variant(mieBrightness);
  234. // cmd[i].shaderParameters["SpotBrightness"] = Variant(spotBrightness);
  235. // cmd[i].shaderParameters["ScatterStrength"] = Variant(scatterStrength);
  236. // cmd[i].shaderParameters["RayleighStrength"] = Variant(rayleighStrength);
  237. // cmd[i].shaderParameters["MieStrength"] = Variant(mieStrength);
  238. // cmd[i].shaderParameters["RayleighCollectionPower"] = Variant(rayleighCollectionPower);
  239. // cmd[i].shaderParameters["MieDistribution"] = Variant(mieDistribution);
  240. // cmd[i].shaderParameters["InvProj"] = Variant(procSkyCamera.projection.Inverse());
  241. //}
  242.  
  243. procSkyRenderPath.shaderParameters["Kr"] = Variant(Kr);
  244. procSkyRenderPath.shaderParameters["RayleighBrightness"] = Variant(rayleighBrightness);
  245. procSkyRenderPath.shaderParameters["MieBrightness"] = Variant(mieBrightness);
  246. procSkyRenderPath.shaderParameters["SpotBrightness"] = Variant(spotBrightness);
  247. procSkyRenderPath.shaderParameters["ScatterStrength"] = Variant(scatterStrength);
  248. procSkyRenderPath.shaderParameters["RayleighStrength"] = Variant(rayleighStrength);
  249. procSkyRenderPath.shaderParameters["MieStrength"] = Variant(mieStrength);
  250. procSkyRenderPath.shaderParameters["RayleighCollectionPower"] = Variant(rayleighCollectionPower);
  251. procSkyRenderPath.shaderParameters["MieDistribution"] = Variant(mieDistribution);
  252. procSkyRenderPath.shaderParameters["InvProj"] = Variant(procSkyCamera.projection.Inverse());
  253.  
  254.  
  255.  
  256. }
  257.  
  258. void SetRenderQueued(bool isQueued = true)
  259. {
  260. if (procSkyRenderQueued == isQueued || procSkyRenderPath is null) return;
  261. procSkyRenderPath.SetEnabled("ProcSky", isQueued);
  262. procSkyRenderQueued = isQueued;
  263.  
  264. }
  265.  
  266. void ProcSkyPostRenderUpdate()
  267. {
  268. //SetRenderQueued(false);
  269. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement