mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-04 04:26:42 +00:00 
			
		
		
		
	dirty cylindrical projection
This commit is contained in:
		
							parent
							
								
									3be9e2ee95
								
							
						
					
					
						commit
						4761a3d98b
					
				
					 1 changed files with 79 additions and 6 deletions
				
			
		| 
						 | 
					@ -638,6 +638,80 @@ namespace MWRender
 | 
				
			||||||
            return mImages[index].get();
 | 
					            return mImages[index].get();
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void create(osg::Image *dest, int w, int h)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            dest->allocateImage(w,h,mImages[0]->r(),mImages[0]->getPixelFormat(),mImages[0]->getDataType());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            for (int j = 0; j < h; ++j)
 | 
				
			||||||
 | 
					                for (int i = 0; i < w; ++i)
 | 
				
			||||||
 | 
					                    dest->setColor(getColorByDirection(cylindricalCoords(i / ((float) w), j / ((float) h))),i,j);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        osg::Vec3d cylindricalCoords(double x, double y)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            osg::Vec3 result = osg::Vec3d(sin(x * 2 * osg::PI),cos(x * 2 * osg::PI),y * 2.0 - 1.0);
 | 
				
			||||||
 | 
					            result.normalize();
 | 
				
			||||||
 | 
					            return result;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        osg::Vec4 getColorByDirection(osg::Vec3d d)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            double x, y;
 | 
				
			||||||
 | 
					            double ma;       // see OpenGL 4.4 specification page 241
 | 
				
			||||||
 | 
					            int side;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            double ax, ay, az;
 | 
				
			||||||
 | 
					            ax = d.x() > 0 ? d.x() : -d.x();
 | 
				
			||||||
 | 
					            ay = d.y() > 0 ? d.y() : -d.y();
 | 
				
			||||||
 | 
					            az = d.z() > 0 ? d.z() : -d.z();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if (ax > ay)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (ax > az)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    side = d.x() > 0 ? 1 : 3;
 | 
				
			||||||
 | 
					                    ma = ax;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    side = d.z() > 0 ? 5 : 4;
 | 
				
			||||||
 | 
					                    ma = az;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                if (ay > az)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    side = d.y() > 0 ? 0 : 2;
 | 
				
			||||||
 | 
					                    ma = ay;
 | 
				
			||||||
 | 
					                } 
 | 
				
			||||||
 | 
					                else
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    side = d.z() > 0 ? 5 : 4;
 | 
				
			||||||
 | 
					                    ma = az;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            switch (side)
 | 
				
			||||||
 | 
					            {
 | 
				
			||||||
 | 
					                case 0: x = d.x();  y = d.z(); break;
 | 
				
			||||||
 | 
					                case 1: x = -d.y();  y = d.z(); break;
 | 
				
			||||||
 | 
					                case 2: x = -d.x(); y = d.z(); break;
 | 
				
			||||||
 | 
					                case 3: x = d.y(); y = d.z(); break;
 | 
				
			||||||
 | 
					                case 4: x = d.x(); y = d.y(); break;
 | 
				
			||||||
 | 
					                case 5: x = d.x(); y = -d.y(); break;
 | 
				
			||||||
 | 
					                default: break;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            x = 0.5 * (x / ma + 1);
 | 
				
			||||||
 | 
					            y = 0.5 * (y / ma + 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            return mImages[side]->getColor(
 | 
				
			||||||
 | 
					                std::min(std::max(int(x * mSize),0),mSize - 1),
 | 
				
			||||||
 | 
					                std::min(std::max(int(y * mSize),0),mSize - 1));       //osg::Vec4(d.x(),d.y(),d.z(),1);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    protected:
 | 
					    protected:
 | 
				
			||||||
        std::vector<osg::ref_ptr<osg::Image>> mImages;
 | 
					        std::vector<osg::ref_ptr<osg::Image>> mImages;
 | 
				
			||||||
        int mSize;
 | 
					        int mSize;
 | 
				
			||||||
| 
						 | 
					@ -645,9 +719,6 @@ namespace MWRender
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void RenderingManager::screenshot360(osg::Image* image, int w)
 | 
					    void RenderingManager::screenshot360(osg::Image* image, int w)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        int resultW = 1024;
 | 
					 | 
				
			||||||
        int resultH = 768;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        SphericalScreenshot s(w);
 | 
					        SphericalScreenshot s(w);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        osg::Vec3 directions[6] = {
 | 
					        osg::Vec3 directions[6] = {
 | 
				
			||||||
| 
						 | 
					@ -670,16 +741,18 @@ namespace MWRender
 | 
				
			||||||
            osg::Image *sideImage = s.getImage(i);
 | 
					            osg::Image *sideImage = s.getImage(i);
 | 
				
			||||||
            screenshot(sideImage,w,w,directions[i]);
 | 
					            screenshot(sideImage,w,w,directions[i]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            if (i == 0)
 | 
					          //    if (i == 0)
 | 
				
			||||||
                //image->allocateImage(resultW,resultH,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
					                //image->allocateImage(resultW,resultH,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
				
			||||||
                image->allocateImage(6 * w,w,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
					                //image->allocateImage(6 * w,w,sideImage->r(),sideImage->getPixelFormat(),sideImage->getDataType());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            osg::copyImage(sideImage,0,0,0,sideImage->s(),sideImage->t(),sideImage->r(),image,w * i,0,0);
 | 
					          //    osg::copyImage(sideImage,0,0,0,sideImage->s(),sideImage->t(),sideImage->r(),image,w * i,0,0);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (mCamera->isFirstPerson())
 | 
					        if (mCamera->isFirstPerson())
 | 
				
			||||||
            mPlayerAnimation->getObjectRoot()->setNodeMask(1);
 | 
					            mPlayerAnimation->getObjectRoot()->setNodeMask(1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        s.create(image,1600,768);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        mFieldOfView = fovBackup;
 | 
					        mFieldOfView = fovBackup;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue