Advertisement
Guest User

Untitled

a guest
Apr 14th, 2013
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.58 KB | None | 0 0
  1. #include <irrlicht.h>
  2. #include <iostream>
  3. using namespace irr;
  4.  
  5. #ifdef _MSC_VER
  6. #pragma comment(lib, "Irrlicht.lib")
  7. #endif
  8.  
  9.  
  10. ////
  11. IrrlichtDevice* device = 0;
  12. bool UseHighLevelShaders = true;
  13.  
  14. class MyShaderCallBack : public video::IShaderConstantSetCallBack
  15. {
  16. public:
  17. virtual void OnSetConstants(video::IMaterialRendererServices* services,
  18. s32 userData)
  19. {
  20. video::IVideoDriver* driver = services->getVideoDriver();
  21. // set clip matrix
  22. core::matrix4 worldViewProj;
  23. core::matrix4 world;
  24. worldViewProj = driver->getTransform(video::ETS_PROJECTION);
  25. worldViewProj *= driver->getTransform(video::ETS_VIEW);
  26. worldViewProj *= driver->getTransform(video::ETS_WORLD);
  27. world = driver->getTransform(video::ETS_WORLD);
  28. if (UseHighLevelShaders){
  29. services->setVertexShaderConstant("matViewProjection", worldViewProj.pointer(), 16);
  30. services->setVertexShaderConstant("World", world.pointer(), 16);
  31. }
  32. else
  33. services->setVertexShaderConstant(worldViewProj.pointer(), 4, 4);
  34.  
  35. //send camPos
  36. core::vector3df pos = device->getSceneManager()->getActiveCamera()->getAbsolutePosition();
  37.  
  38. if (UseHighLevelShaders)
  39. services->setPixelShaderConstant("camPos", reinterpret_cast<f32*>(&pos), 3);
  40. else
  41. services->setPixelShaderConstant(reinterpret_cast<f32*>(&pos), 8, 1);
  42. }
  43. };
  44.  
  45.  
  46. int main()
  47. {
  48. irr::SIrrlichtCreationParameters params;
  49. params.DriverType=video::EDT_DIRECT3D9;
  50. params.WindowSize=core::dimension2d<u32>(1360, 768);
  51. device = createDeviceEx(params);
  52.  
  53. if (device == 0)
  54. return 1; // could not create selected driver.
  55.  
  56.  
  57.  
  58. video::IVideoDriver* driver = device->getVideoDriver();
  59. scene::ISceneManager* smgr = device->getSceneManager();
  60. gui::IGUIEnvironment* env = device->getGUIEnvironment();
  61.  
  62. //driver->setFog(video::SColor(255,60,60,60));
  63. driver->setFog(video::SColor(255,60,250,60), video::EFT_FOG_LINEAR, 10, 20, 0.01f, false,false);
  64.  
  65. // add camera
  66. scene::ICameraSceneNode* camera =
  67. smgr->addCameraSceneNodeFPS(0,100.0f,3.2f);
  68.  
  69. camera->setPosition(core::vector3df(2700,4000,2600));
  70. camera->setTarget(core::vector3df(2397*2,343*2,2700*2));
  71. camera->setFarValue(42000.0f);
  72.  
  73. scene::ISceneNode* test = smgr->addCubeSceneNode(600,0,0,irr::core::vector3df(0,2000,0));
  74. test->setMaterialFlag(video::EMF_LIGHTING, false);
  75. test->setMaterialTexture(0, driver->getTexture("sandstone.jpg"));
  76.  
  77. // disable mouse cursor
  78. device->getCursorControl()->setVisible(false);
  79.  
  80. // add terrain scene node
  81. scene::ITerrainSceneNode* terrain = smgr->addTerrainSceneNode(
  82. "heightmap.jpg",
  83. 0, // parent node
  84. -1, // node id
  85. core::vector3df(0.f, 0.f, 0.f), // position
  86. core::vector3df(0.f, 0.f, 0.f), // rotation
  87. core::vector3df(50, 5, 50), // scale
  88. video::SColor ( 255, 255, 255, 255 ), // vertexColor
  89. 5, // maxLOD
  90. scene::ETPS_17, // patchSize
  91. 4 // smoothFactor
  92. );
  93. terrain->scaleTexture(1.0f, 20.0f);
  94.  
  95.  
  96. // create triangle selector for the terrain
  97. scene::ITriangleSelector* selector
  98. = smgr->createTerrainTriangleSelector(terrain, 0);
  99. terrain->setTriangleSelector(selector);
  100.  
  101. // create collision response animator and attach it to the camera
  102. scene::ISceneNodeAnimator* anim = smgr->createCollisionResponseAnimator(
  103. selector, camera, core::vector3df(60,100,60),
  104. core::vector3df(0,0,0),
  105. core::vector3df(0,50,0));
  106. selector->drop();
  107. camera->addAnimator(anim);
  108. anim->drop();
  109. //////////////
  110. // create skydome
  111. driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false);
  112. scene::ISceneNode* skydome=smgr->addSkyDomeSceneNode(driver->getTexture("skydome.jpg"),16,8,0.95f,2.0f);
  113. driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true);
  114. // create event receiver
  115.  
  116. io::path vsFileName = "Dx_Shader.hlsl";
  117. io::path psFileName = "Dx_Shader.hlsl";
  118. if (!driver->queryFeature(video::EVDF_PIXEL_SHADER_2_0))
  119. {
  120. device->getLogger()->log("WARNING: Pixel shaders disabled "\
  121. "because of missing driver/hardware support.");
  122. psFileName = "";
  123. }
  124.  
  125. if (!driver->queryFeature(video::EVDF_VERTEX_SHADER_2_0))
  126. {
  127. device->getLogger()->log("WARNING: Vertex shaders disabled "\
  128. "because of missing driver/hardware support.");
  129. vsFileName = "";
  130. }
  131. // create materials
  132.  
  133. video::IGPUProgrammingServices* gpu = driver->getGPUProgrammingServices();
  134. s32 newMaterialType = 0;
  135. if (gpu)
  136. {
  137. MyShaderCallBack* mc = new MyShaderCallBack();
  138. // create the shaders depending on if the user wanted high level
  139. // or low level shaders:
  140. if (UseHighLevelShaders)
  141. {
  142. // create material from high level shaders (hlsl or glsl)
  143. newMaterialType = gpu->addHighLevelShaderMaterialFromFiles(
  144. vsFileName, "vs_main", video::EVST_VS_2_0,
  145. psFileName, "ps_main", video::EPST_PS_2_0,
  146. mc, video::EMT_DETAIL_MAP);
  147. }
  148. mc->drop();
  149. }
  150.  
  151.  
  152. irr::video::ITexture * tex = driver->getTexture("base.png");
  153. terrain->setMaterialTexture(0,tex);
  154. terrain->setMaterialTexture(1,driver->getTexture("tex1.jpg"));
  155. terrain->setMaterialTexture(2,driver->getTexture("tex2.jpg"));
  156. terrain->setMaterialTexture(3,driver->getTexture("tex3.JPG"));
  157. terrain->setMaterialTexture(4,driver->getTexture("tex4.JPG"));
  158. terrain->setMaterialTexture(5,driver->getTexture("tex5.JPG"));
  159. terrain->setMaterialTexture(6,driver->getTexture("tex6.JPG"));
  160. terrain->setMaterialTexture(7,driver->getTexture("tex7.JPG"));
  161. terrain->setMaterialType((video::E_MATERIAL_TYPE)newMaterialType);
  162.  
  163.  
  164. terrain->setMaterialFlag(video::EMF_LIGHTING, false);
  165. //terrain->setMaterialFlag(video::EMF_FOG_ENABLE, true);
  166.  
  167.  
  168. int texSize=256;
  169.  
  170. int count=0;
  171.  
  172. int lastFPS = -1;
  173.  
  174. while(device->run())
  175. if (device->isWindowActive())
  176. {
  177. driver->beginScene(true, true, 0 );
  178.  
  179. smgr->drawAll();
  180. env->drawAll();
  181.  
  182. count++;
  183.  
  184.  
  185. float camPosition[] = {0,0,0};
  186. //pEffect->SetValue("camposition",campos,3*sizeof(float));
  187. //D3DDEVICE->SetVertexShaderConstantF( 0, camPosition, 1);
  188.  
  189. //test change of terrain-texture
  190. if(count>200){
  191. count=-10000;
  192.  
  193. u8 * pixel=(u8*)tex->lock();
  194. int pitch = tex->getPitch();
  195. int pPixel = 4;
  196. int texType=0;
  197. int texCount=0;
  198.  
  199. if(1)
  200. for(int x=texSize/3;x<texSize*2/3;x++){
  201. for(int y=0;y<texSize;y++)
  202. pixel[pitch*y + x*pPixel+1] =255;
  203. }
  204. if(1)
  205. for(int x=0;x<texSize*1/3;x++){
  206. for(int y=0;y<texSize;y++)
  207. pixel[pitch*y + x*pPixel+0] =255;
  208. }
  209.  
  210.  
  211.  
  212. tex->unlock();
  213. tex->regenerateMipMapLevels();
  214. }
  215.  
  216.  
  217. driver->endScene();
  218.  
  219. // display frames per second in window title
  220. int fps = driver->getFPS();
  221. if (lastFPS != fps)
  222. {
  223. core::stringw str = L"Terrain Renderer - Irrlicht Engine [";
  224. str += driver->getName();
  225. str += "] FPS:";
  226. str += fps;
  227. // Also print terrain height of current camera position
  228. // We can use camera position because terrain is located at coordinate origin
  229. str += " Height: ";
  230.  
  231. str += terrain->getHeight(camera->getAbsolutePosition().X,
  232. camera->getAbsolutePosition().Z);
  233.  
  234.  
  235. device->setWindowCaption(str.c_str());
  236. lastFPS = fps;
  237. }
  238. }
  239. device->drop();
  240. return 0;
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement