[2189] | 1 | #include "OgrePMEntryPointMapRenderingRun.h"
|
---|
| 2 | #include "OgreIlluminationManager.h"
|
---|
| 3 |
|
---|
| 4 | OgrePMEntryPointMapRenderingRun::OgrePMEntryPointMapRenderingRun(String name)
|
---|
| 5 | : OgreRenderingRun(1, 1)
|
---|
| 6 | , RenderingRun(1, 1)
|
---|
| 7 | {
|
---|
| 8 | this->name = name;
|
---|
| 9 |
|
---|
| 10 | createEntryPointMap();
|
---|
| 11 | }
|
---|
| 12 |
|
---|
| 13 | void OgrePMEntryPointMapRenderingRun::createEntryPointMap()
|
---|
| 14 | {
|
---|
| 15 | unsigned int entryPointCnt = OgreIlluminationManager::getSingleton().getPathMapEntryPoints().size();
|
---|
| 16 | int width = entryPointCnt / 4096 * 2;
|
---|
| 17 | int height = 4096;
|
---|
| 18 | TexturePtr texPtr = Ogre::TextureManager::getSingleton().createManual(name,
|
---|
| 19 | "default",
|
---|
| 20 | TEX_TYPE_2D,
|
---|
| 21 | width,
|
---|
| 22 | height,
|
---|
| 23 | 0,
|
---|
| 24 | 0,
|
---|
| 25 | PF_FLOAT32_RGBA,
|
---|
| 26 | TU_DEFAULT);
|
---|
| 27 | entryPointTexture = texPtr.getPointer();
|
---|
| 28 |
|
---|
| 29 | struct TMR
|
---|
| 30 | {
|
---|
| 31 | float pos[4];
|
---|
| 32 | float dir[4];
|
---|
| 33 | };
|
---|
| 34 | TMR* tm = new TMR[entryPointCnt];
|
---|
| 35 | for(int i=0; i<entryPointCnt; i++)
|
---|
| 36 | {
|
---|
| 37 | PathMapEntryPoint* EP = &OgreIlluminationManager::getSingleton().getPathMapEntryPoints().at(i);
|
---|
| 38 | tm[i].pos[0] = EP->position.x;
|
---|
| 39 | tm[i].pos[1] = EP->position.y;
|
---|
| 40 | tm[i].pos[2] = EP->position.z;
|
---|
| 41 | tm[i].pos[3] = 1.0;
|
---|
| 42 | tm[i].dir[0] = EP->normal.x;
|
---|
| 43 | tm[i].dir[1] = EP->normal.y;
|
---|
| 44 | tm[i].dir[2] = EP->normal.z;
|
---|
[2200] | 45 | tm[i].dir[3] = EP->prob;
|
---|
[2189] | 46 | }
|
---|
| 47 |
|
---|
| 48 | PixelBox lockBox(width, height, 1, PF_FLOAT32_RGBA, tm);
|
---|
| 49 | entryPointTexture->getBuffer()->blitFromMemory(lockBox);
|
---|
[2200] | 50 |
|
---|
| 51 | delete[] tm;
|
---|
| 52 |
|
---|
| 53 | int clusterCount = OgreIlluminationManager::getSingleton().getPathMapClusterLengthsSize();
|
---|
| 54 | width = clusterCount;
|
---|
| 55 | height = 2;
|
---|
| 56 | texPtr = Ogre::TextureManager::getSingleton().createManual(name + "_CL",
|
---|
| 57 | "default",
|
---|
| 58 | TEX_TYPE_2D,
|
---|
| 59 | width,
|
---|
| 60 | height,
|
---|
| 61 | 0,
|
---|
| 62 | 0,
|
---|
| 63 | PF_FLOAT32_R,
|
---|
| 64 | TU_RENDERTARGET);
|
---|
| 65 | clusterLengthTexture = texPtr.getPointer();
|
---|
| 66 |
|
---|
| 67 | float* data = new float[clusterCount * 2];
|
---|
[2420] | 68 | unsigned int clusterStartEntryPoint = 0;
|
---|
[2200] | 69 | for(int i = 0; i < clusterCount; i++)
|
---|
| 70 | {
|
---|
| 71 | unsigned int clusterSize = OgreIlluminationManager::getSingleton().getPathMapClusterLength(i);
|
---|
| 72 | data[i] = clusterSize;//clustercount
|
---|
[2420] | 73 | data[clusterCount + i] = clusterStartEntryPoint;
|
---|
| 74 | for(int j = 0; j < clusterSize; j++)
|
---|
| 75 | {
|
---|
| 76 | PathMapEntryPoint* EP = &OgreIlluminationManager::getSingleton().getPathMapEntryPoints().at(clusterStartEntryPoint + j);
|
---|
| 77 | EP->clusterID = i;
|
---|
| 78 | }
|
---|
| 79 | clusterStartEntryPoint += clusterSize;
|
---|
[2200] | 80 | }
|
---|
| 81 |
|
---|
| 82 | PixelBox lockBox2(width, height, 1, PF_FLOAT32_R, data);
|
---|
| 83 | clusterLengthTexture->getBuffer()->blitFromMemory(lockBox2);
|
---|
| 84 |
|
---|
| 85 | delete[] data;
|
---|
[2420] | 86 |
|
---|
| 87 | if(false)
|
---|
| 88 | {
|
---|
| 89 | SceneManager* sm = Root::getSingleton()._getCurrentSceneManager();
|
---|
| 90 | BillboardSet* bbs = sm->createBillboardSet("WEIGHT_DEBUG", 4096);
|
---|
| 91 | bbs->setDefaultDimensions(0.1, 0.1);
|
---|
| 92 | for(int i= 0; i < entryPointCnt;i++)
|
---|
| 93 | {
|
---|
| 94 | PathMapEntryPoint* EP = &OgreIlluminationManager::getSingleton().getPathMapEntryPoints().at(i);
|
---|
| 95 | int r = i / 256;
|
---|
| 96 | int g = i - r * 256;
|
---|
| 97 | float rr = (float) r / 256.0;
|
---|
| 98 | float gg = (float) g / 256.0;
|
---|
| 99 |
|
---|
| 100 | ColourValue c;
|
---|
| 101 | c = ColourValue(rr, gg, 0);
|
---|
| 102 | /*c = ColourValue(
|
---|
| 103 | Math::Ceil(Math::Floor(EP->position.x)),
|
---|
| 104 | Math::Ceil(Math::Floor(EP->position.y)),
|
---|
| 105 | Math::Ceil(Math::Floor(EP->position.z)));*/
|
---|
| 106 | //c = ColourValue(0,0,1,0);
|
---|
| 107 | bbs->createBillboard(Vector3(EP->position.x, i, EP->position.z), c);
|
---|
| 108 | }
|
---|
| 109 | bbs->setPointRenderingEnabled(true);
|
---|
| 110 | bbs->setMaterialName("GTP/PM/EPBillboards");
|
---|
| 111 | sm->getRootSceneNode()->createChildSceneNode("WEIGHT_DEBUG_SN")->attachObject(bbs);
|
---|
| 112 | }
|
---|
[2189] | 113 | }
|
---|
| 114 |
|
---|
| 115 | void OgrePMEntryPointMapRenderingRun::updateFrame(unsigned long frameNum)
|
---|
| 116 | {
|
---|
| 117 |
|
---|
| 118 | }
|
---|
| 119 |
|
---|
[2320] | 120 | void OgrePMEntryPointMapRenderingRun::freeAllResources()
|
---|
| 121 | {
|
---|
[2321] | 122 | this->entryPointTexture = 0;
|
---|
| 123 | this->clusterLengthTexture = 0;
|
---|
[2320] | 124 | TextureManager::getSingleton().remove(name);
|
---|
| 125 | TextureManager::getSingleton().remove(name + "_CL");
|
---|
| 126 | }
|
---|
[2189] | 127 |
|
---|
[2320] | 128 |
|
---|
| 129 |
|
---|