nier_test.cpp 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include <irrlicht/irrlicht.h>
  2. #include <cstdint>
  3. #include <iostream>
  4. #include <wallpaperengine/config.h>
  5. #include <wallpaperengine/video/renderer.h>
  6. #include <wallpaperengine/video/material.h>
  7. #include "common.h"
  8. #include "wallpaperengine/shaders/compiler.h"
  9. #include "wallpaperengine/project.h"
  10. #include "wallpaperengine/irrlicht.h"
  11. #include "nier_test.h"
  12. irr::f32 g_AnimationSpeed = 0.1f;
  13. irr::f32 g_Scale = 2.5f;
  14. irr::f32 g_ScrollSpeed = 0.0f;
  15. irr::f32 g_Direction = 0.0f;
  16. irr::f32 g_Strength = 0.07f;
  17. irr::f32 g_SpecularPower = 1.0f;
  18. irr::f32 g_SpecularStrength = 1.0f;
  19. irr::f32 g_SpecularColor [3] = {1.0f, 1.0f, 1.0f};
  20. irr::f32 g_Texture1Resolution [4] = {1.0f, 1.0f, 1.0f, 1.0f};
  21. irr::f32 g_Texture0 = 0;
  22. irr::f32 g_Texture1 = 1;
  23. irr::f32 g_Texture2 = 2;
  24. irr::f32 g_Time = 0;
  25. class MyShaderCallback : public irr::video::IShaderConstantSetCallBack
  26. {
  27. virtual void OnSetConstants (irr::video::IMaterialRendererServices* services, int32_t userData)
  28. {
  29. irr::video::IVideoDriver* driver = services->getVideoDriver ();
  30. irr::core::matrix4 worldViewProj;
  31. worldViewProj = driver->getTransform(irr::video::ETS_PROJECTION);
  32. worldViewProj *= driver->getTransform(irr::video::ETS_VIEW);
  33. worldViewProj *= driver->getTransform(irr::video::ETS_WORLD);
  34. services->setVertexShaderConstant ("g_AnimationSpeed", &g_AnimationSpeed, 1);
  35. services->setVertexShaderConstant ("g_Scale", &g_Scale, 1);
  36. services->setVertexShaderConstant ("g_ScrollSpeed", &g_ScrollSpeed, 1);
  37. services->setVertexShaderConstant ("g_Direction", &g_Direction, 1);
  38. services->setVertexShaderConstant ("g_Time", &g_Time, 1);
  39. services->setVertexShaderConstant ("g_ModelViewProjectionMatrix", worldViewProj.pointer(), 16);
  40. services->setVertexShaderConstant ("g_Texture0Resolution", g_Texture1Resolution, 4);
  41. services->setVertexShaderConstant ("g_Texture1Resolution", g_Texture1Resolution, 4);
  42. services->setVertexShaderConstant ("g_Texture2Resolution", g_Texture1Resolution, 4);
  43. // TODO: Support up to 7 materials (as wallpaper engine)
  44. services->setPixelShaderConstant ("g_Strength", &g_Strength, 1);
  45. services->setPixelShaderConstant ("g_SpecularPower", &g_SpecularPower, 1);
  46. services->setPixelShaderConstant ("g_SpecularStrength", &g_SpecularStrength, 1);
  47. services->setPixelShaderConstant ("g_SpecularColor", g_SpecularColor, 3);
  48. services->setPixelShaderConstant ("g_Texture0", &g_Texture0, 1);
  49. services->setPixelShaderConstant ("g_Texture1", &g_Texture1, 1);
  50. services->setPixelShaderConstant ("g_Texture2", &g_Texture2, 1);
  51. }
  52. };
  53. int nier_test ()
  54. {
  55. do_decompress ();
  56. irr::io::path _wp_engine_folder = "/home/almamu/Development/tmp/nier__automata_-_become_as_gods_edition/";
  57. // set our working directory
  58. wp::fs::resolver.changeWorkingDirectory (_wp_engine_folder);
  59. wp::project* wp_project = new wp::project ();
  60. /*wp::fs::resolver.changeWorkingDirectory (wp::config::path::resources);
  61. irr::io::path _water_example = wp::fs::resolver.resolve ("materials/water-intact.png");
  62. irr::io::path _mud_example = wp::fs::resolver.resolve ("materials/plant-on-water.png");
  63. irr::io::path _background_example = wp::fs::resolver.resolve ("materials/top-part.png");
  64. irr::io::path _waterripple_normal = wp::fs::resolver.resolve ("materials/effects/waterripplenormal.png");
  65. irr::io::path _waterripple_frag_shader = wp::fs::resolver.resolve ("shaders/effects/waterripple_opengl.frag");
  66. irr::io::path _waterripple_vert_shader = wp::fs::resolver.resolve ("shaders/effects/waterripple_opengl.vert");
  67. irr::io::path _white = wp::fs::resolver.resolve ("materials/white.png");
  68. // check for ps and vs support
  69. if (wp::irrlicht::driver->queryFeature (irr::video::EVDF_PIXEL_SHADER_1_1) == false && wp::irrlicht::driver->queryFeature (irr::video::EVDF_ARB_FRAGMENT_PROGRAM_1) == false)
  70. {
  71. wp::irrlicht::device->getLogger ()->log ("WARNING: Pixel shaders disabled because of missing driver/hardware support");
  72. _waterripple_frag_shader = "";
  73. }
  74. if (wp::irrlicht::driver->queryFeature (irr::video::EVDF_VERTEX_SHADER_1_1) == false && wp::irrlicht::driver->queryFeature (irr::video::EVDF_ARB_VERTEX_PROGRAM_1) == false)
  75. {
  76. wp::irrlicht::device->getLogger ()->log ("WARNING: Vertex shaders disabled because of missing driver/hardware support");
  77. _waterripple_vert_shader = "";
  78. }
  79. irr::video::IGPUProgrammingServices* gpuProgrammingServices = wp::irrlicht::driver->getGPUProgrammingServices ();
  80. int32_t materialType1 = 0;
  81. if (gpuProgrammingServices)
  82. {
  83. MyShaderCallback* shader = new MyShaderCallback ();
  84. wp::shaders::compiler _vert(_waterripple_vert_shader, wp::shaders::compiler::Type::Type_Vertex);
  85. wp::shaders::compiler _frag(_waterripple_frag_shader, wp::shaders::compiler::Type::Type_Pixel);
  86. materialType1 = gpuProgrammingServices->addHighLevelShaderMaterial(
  87. _vert.precompile ().c_str (), "vertexMain", irr::video::EVST_VS_2_0,
  88. _frag.precompile ().c_str (), "pixelMain", irr::video::EPST_PS_2_0,
  89. shader, irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL, 0, irr::video::EGSL_DEFAULT
  90. );
  91. shader->drop ();
  92. }
  93. // load some basic textures
  94. irr::video::ITexture* waterTexture = wp::irrlicht::driver->getTexture (_water_example.c_str ());
  95. irr::video::ITexture* mudTexture = wp::irrlicht::driver->getTexture (_mud_example.c_str ());
  96. irr::video::ITexture* backgroundExample = wp::irrlicht::driver->getTexture (_background_example.c_str ());
  97. irr::video::ITexture* waterRippleNormalTexture = wp::irrlicht::driver->getTexture (_waterripple_normal.c_str ());
  98. irr::video::ITexture* whiteTexture = wp::irrlicht::driver->getTexture (_white.c_str ());
  99. // get scene manager
  100. irr::scene::ISceneManager* sceneManager = wp::irrlicht::device->getSceneManager ();*/
  101. if (wp_project->getScene ()->isOrthogonal() == true)
  102. {
  103. wp::video::renderer::setupOrthographicCamera (
  104. wp_project->getScene ()->getProjectionWidth (),
  105. wp_project->getScene ()->getProjectionHeight (),
  106. wp_project->getScene ()->getCamera ()->getCenter (),
  107. wp_project->getScene ()->getCamera ()->getEye (),
  108. wp_project->getScene ()->getCamera ()->getUp ().X,
  109. wp_project->getScene ()->getCamera ()->getUp ().Y
  110. );
  111. }
  112. else
  113. {
  114. wp::irrlicht::device->getLogger ()->log ("Non-orthogonal cameras not supported yet!!");
  115. return 0;
  116. }
  117. /* wp::video::material* waterNode = new wp::video::material (irr::core::vector3df (960.0f, 540.0f, 0.0f), wp_project->getScene ());
  118. wp::video::material* backgroundNode = new wp::video::material (irr::core::vector3df (960.0f, 540.0f, 0.0f), wp_project->getScene ());
  119. wp::video::material* mudNode = new wp::video::material (irr::core::vector3df (960.0f, 540.0f, 0.0f), wp_project->getScene ());
  120. backgroundNode->getMaterial ().setTexture (0, backgroundExample);
  121. backgroundNode->setType (irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);
  122. mudNode->getMaterial ().setTexture (0, mudTexture);
  123. mudNode->setType (irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL);
  124. waterNode->setFlag (irr::video::EMF_LIGHTING, false);
  125. waterNode->setFlag (irr::video::EMF_BLEND_OPERATION, true);
  126. waterNode->getMaterial ().setTexture (0, waterTexture);
  127. waterNode->getMaterial ().setTexture (1, waterRippleNormalTexture);
  128. waterNode->getMaterial ().setTexture (2, whiteTexture);
  129. waterNode->setType ( (irr::video::E_MATERIAL_TYPE) materialType1);*/
  130. // register nodes
  131. wp::video::renderer::queueNode (wp_project->getScene ());
  132. // wp::video::renderer::queueNode (backgroundNode);
  133. // wp::video::renderer::queueNode (mudNode);
  134. // wp::video::renderer::queueNode (waterNode);
  135. int32_t lastTime = 0;
  136. int32_t minimumTime = 1000 / 90;
  137. int32_t currentTime = 0;
  138. while (wp::irrlicht::device->run () && wp::irrlicht::driver)
  139. {
  140. // if (device->isWindowActive ())
  141. {
  142. currentTime = wp::irrlicht::device->getTimer ()->getTime ();
  143. g_Time = currentTime / 1000.0f;
  144. if (currentTime - lastTime > minimumTime)
  145. {
  146. wp::video::renderer::render ();
  147. lastTime = currentTime;
  148. }
  149. else
  150. {
  151. wp::irrlicht::device->sleep (1, false);
  152. }
  153. }
  154. }
  155. return 0;
  156. }