From ed26458a24a96e4e0804902ed1a37b46ef607d0b Mon Sep 17 00:00:00 2001 From: curt Date: Wed, 18 Sep 2002 14:24:19 +0000 Subject: [PATCH] Norman's most recent 3d clouds code tweaks. --- configure.ac | 2 + simgear/scene/sky/clouds3d/Makefile.am | 8 ++ simgear/scene/sky/clouds3d/SkyArchive.cpp | 4 + simgear/scene/sky/clouds3d/SkyCloud.cpp | 74 ++++++++++++++++++- simgear/scene/sky/clouds3d/SkyCloud.hpp | 4 + simgear/scene/sky/clouds3d/SkyContext.cpp | 42 ++++++++--- simgear/scene/sky/clouds3d/SkyContext.hpp | 17 +++-- simgear/scene/sky/clouds3d/SkyLight.cpp | 12 ++- .../clouds3d/SkyRenderableInstanceCloud.cpp | 4 +- .../clouds3d/SkyRenderableInstanceGroup.cpp | 2 +- simgear/scene/sky/clouds3d/SkySceneLoader.cpp | 10 ++- .../scene/sky/clouds3d/SkySceneManager.cpp | 8 +- .../scene/sky/clouds3d/SkyTextureManager.cpp | 8 +- 13 files changed, 162 insertions(+), 33 deletions(-) diff --git a/configure.ac b/configure.ac index 037ef77f..d6e8c80e 100644 --- a/configure.ac +++ b/configure.ac @@ -167,6 +167,8 @@ fi dnl check for OpenGL related libraries +AM_CONDITIONAL(EXTGL_NEEDED, test "x$ac_cv_header_windows_h" = "xyes") + if test "x$HOSTTYPE" = "xmacintosh" ; then dnl Macintosh OSX LIBS="$LIBS -framework OpenGL -framework GLUT" diff --git a/simgear/scene/sky/clouds3d/Makefile.am b/simgear/scene/sky/clouds3d/Makefile.am index 9b492a4a..566f3ee7 100644 --- a/simgear/scene/sky/clouds3d/Makefile.am +++ b/simgear/scene/sky/clouds3d/Makefile.am @@ -1,5 +1,12 @@ includedir = @includedir@/sky/clouds3d +EXTRA_DIST = extlg.c +if EXTGL_NEEDED + EXTGL_SOURCE = extgl.c +else + EXTGL_SOURCE = +endif + lib_LIBRARIES = libsgclouds3d.a include_HEADERS = \ @@ -7,6 +14,7 @@ include_HEADERS = \ SkyUtil.hpp libsgclouds3d_a_SOURCES = \ + $(EXTRA_SOURCE) \ vec3fv.cpp \ mat16fv.cpp \ tri.cpp \ diff --git a/simgear/scene/sky/clouds3d/SkyArchive.cpp b/simgear/scene/sky/clouds3d/SkyArchive.cpp index 30344f37..4b52e199 100644 --- a/simgear/scene/sky/clouds3d/SkyArchive.cpp +++ b/simgear/scene/sky/clouds3d/SkyArchive.cpp @@ -963,6 +963,10 @@ SKYRESULT SkyArchive::Load(const char* pFileName) FAIL_RETURN_MSG(SKYRESULT_FAIL, "Error: SkyArchive::Load(): file name is NULL."); } FILE* pSrcFile = NULL; + + char buf[512]; + sprintf(buf,"SkyArchive::Load(%s)",pFileName); + SkyTrace(buf); if (NULL == (pSrcFile = fopen(pFileName, "rb"))) // file opened successfully { SkyTrace("Error: SkyArchive::Load(): failed to open file for reading."); diff --git a/simgear/scene/sky/clouds3d/SkyCloud.cpp b/simgear/scene/sky/clouds3d/SkyCloud.cpp index cf3574f8..48275bb3 100644 --- a/simgear/scene/sky/clouds3d/SkyCloud.cpp +++ b/simgear/scene/sky/clouds3d/SkyCloud.cpp @@ -225,7 +225,7 @@ SKYRESULT SkyCloud::Display(const Camera &camera, SkyRenderableInstance *pInstan color = p->GetBaseColor(); if (_bUsePhaseFunction) // use the phase function for anisotropic scattering. - { + { eyeDir = cam.Orig; eyeDir -= p->GetPosition(); eyeDir.Normalize(); @@ -629,6 +629,78 @@ SkyMinMaxBox* SkyCloud::CopyBoundingVolume() const * * If @a rScale does not equal 1.0, then the cloud is scaled by an amount rScale. */ +SKYRESULT SkyCloud::Load(const SkyArchive &archive, + const sgVec4 *mat, + float rScale /* = 1.0f */, + bool bLocal /* = false */) +{ + unsigned int iNumParticles; + Vec3f vecCenter = Vec3f::ZERO; + //Vec3f vecCenter; + //float rRadius; + //archive.FindVec3f("CldCenter", &vecCenter); + //archive.FindFloat32("CldRadius", &rRadius); + + //_boundingBox.SetMin(vecCenter - Vec3f(rRadius, rRadius, rRadius)); + //_boundingBox.SetMax(vecCenter + Vec3f(rRadius, rRadius, rRadius)); + + archive.FindUInt32("CldNumParticles", &iNumParticles); + if (!bLocal) + archive.FindVec3f("CldCenter", &vecCenter); + + Vec3f *pParticlePositions = new Vec3f[iNumParticles]; + float *pParticleRadii = new float[iNumParticles]; + Vec4f *pParticleColors = new Vec4f[iNumParticles]; + + unsigned int iNumBytes; + archive.FindData("CldParticlePositions", ANY_TYPE, (void**const)&pParticlePositions, &iNumBytes); + archive.FindData("CldParticleRadii", ANY_TYPE, (void**const)&pParticleRadii, &iNumBytes); + archive.FindData("CldParticleColors", ANY_TYPE, (void**const)&pParticleColors, &iNumBytes); + + for (unsigned int i = 0; i < iNumParticles; ++i) + { + SkyCloudParticle *pParticle = new SkyCloudParticle((pParticlePositions[i] + vecCenter) * rScale, + pParticleRadii[i] * rScale, + pParticleColors[i]); + _boundingBox.AddPoint(pParticle->GetPosition()); + + _particles.push_back(pParticle); + } + // this is just a bad hack to align cloud field from skyworks with local horizon at KSFO + // this "almost" works not quite the right solution okay to get some up and running + // we need to develop our own scheme for loading and positioning clouds + Mat33f rot_mat; + Vec3f moveit; + + rot_mat.Set( 1, 0, 0, + 0, 0, -1, + 0, 1, 0); + // flip the y and z axis, clouds now sit in the x-y plane + Rotate( rot_mat ); +// rot_mat.Set(mat[0][0], mat[0][1],mat[0][2], +// mat[1][0], mat[1][1],mat[1][2], +// mat[2][0], mat[2][1],mat[2][2] ); + // adjust for lon af KSFO plus -122.357 +// rot_mat.Set( -0.84473f, 0.53519f, 0.0f, +// -0.53519f, -0.84473f, 0.0f, +// 0.0f, 0.0f, 1.0f); + + //Rotate( rot_mat ); + + // and about x for latitude 37.6135 +// rot_mat.Set( 1.0f, 0.0, 0.0f, +// 0.0f, 0.7921f, -0.6103f, +// 0.0f, 0.6103f, 0.7921f); + +// Rotate( rot_mat ); + + moveit.Set( 1000.0, 0.0, 4050.0 ); + + Translate( moveit ); + + return SKYRESULT_OK; +} + SKYRESULT SkyCloud::Load(const SkyArchive &archive, float rScale /* = 1.0f */, bool bLocal /* = false */) diff --git a/simgear/scene/sky/clouds3d/SkyCloud.hpp b/simgear/scene/sky/clouds3d/SkyCloud.hpp index 24b2d3a6..de7332c8 100644 --- a/simgear/scene/sky/clouds3d/SkyCloud.hpp +++ b/simgear/scene/sky/clouds3d/SkyCloud.hpp @@ -33,6 +33,8 @@ #include "SkyArchive.hpp" #include "mat33.hpp" +#include + class SkyMaterial; class SkyLight; class SkyRenderableInstance; @@ -97,6 +99,8 @@ public: SKYRESULT Save(SkyArchive &archive) const; SKYRESULT Load(const SkyArchive &archive, float rScale = 1.0f, bool bLocal = false); + SKYRESULT Load(const SkyArchive &archive, const sgVec4 *mat, + float rScale = 1.0f, bool bLocal = false); void Rotate(const Mat33f& rot); void Translate(const Vec3f& trans); diff --git a/simgear/scene/sky/clouds3d/SkyContext.cpp b/simgear/scene/sky/clouds3d/SkyContext.cpp index b8727f07..499ed478 100644 --- a/simgear/scene/sky/clouds3d/SkyContext.cpp +++ b/simgear/scene/sky/clouds3d/SkyContext.cpp @@ -19,8 +19,15 @@ * * Graphics Context Interface. Initializes GL extensions, etc. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + #include +#ifndef WIN32 #include +#endif //#include "extgl.h" @@ -46,7 +53,7 @@ SkyContext::SkyContext() // materials and structure classes AddCurrentGLContext(); // Initialize all the extensions and load the functions - JW (file is extgl.c) - #ifdef _WIN32 + #ifdef WIN32 glInitialize(); InitializeExtension("GL_ARB_multitexture"); #endif @@ -122,7 +129,11 @@ SKYRESULT SkyContext::InitializeExtension(const char *pExtensionName) */ SkyMaterial* SkyContext::GetCurrentMaterial() { - ContextMaterialIterator cmi = _currentMaterials.find(glXGetCurrentContext()); +#ifdef WIN32 + ContextMaterialIterator cmi = _currentMaterials.find(wglGetCurrentContext()); +#else + ContextMaterialIterator cmi = _currentMaterials.find(glXGetCurrentContext()); +#endif if (_currentMaterials.end() != cmi) return cmi->second; else @@ -146,7 +157,11 @@ SkyMaterial* SkyContext::GetCurrentMaterial() */ SkyTextureState* SkyContext::GetCurrentTextureState() { - ContextTextureStateIterator ctsi = _currentTextureState.find(glXGetCurrentContext()); +#ifdef WIN32 + ContextTextureStateIterator ctsi = _currentTextureState.find(wglGetCurrentContext()); +#else + ContextTextureStateIterator ctsi = _currentTextureState.find(glXGetCurrentContext()); +#endif if (_currentTextureState.end() != ctsi) return ctsi->second; else @@ -169,14 +184,21 @@ SkyTextureState* SkyContext::GetCurrentTextureState() */ SKYRESULT SkyContext::AddCurrentGLContext() { - SkyMaterial *pCurrentMaterial = new SkyMaterial; - _currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial)); - - SkyTextureState *pCurrentTS = new SkyTextureState; - _currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS)); - return SKYRESULT_OK; -} + SkyMaterial *pCurrentMaterial = new SkyMaterial; +#ifdef WIN32 + _currentMaterials.insert(std::make_pair(wglGetCurrentContext(), pCurrentMaterial)); +#else + _currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial)); +#endif + SkyTextureState *pCurrentTS = new SkyTextureState; +#ifdef WIN32 + _currentTextureState.insert(std::make_pair(wglGetCurrentContext() , pCurrentTS)); +#else + _currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS)); +#endif + return SKYRESULT_OK; +} //------------------------------------------------------------------------------ // Function : SkyContext::Register diff --git a/simgear/scene/sky/clouds3d/SkyContext.hpp b/simgear/scene/sky/clouds3d/SkyContext.hpp index fcf0d18f..160906ff 100644 --- a/simgear/scene/sky/clouds3d/SkyContext.hpp +++ b/simgear/scene/sky/clouds3d/SkyContext.hpp @@ -22,27 +22,28 @@ #ifndef __SKYCONTEXT_HPP__ #define __SKYCONTEXT_HPP__ +#ifdef HAVE_CONFIG_H +# include +#endif + // warning for truncation of template name for browse info -#pragma warning( disable : 4786) +// #pragma warning( disable : 4786) #include "SkySingleton.hpp" -#ifdef _WIN32 -#include "extgl.h" -#endif - #include #include #include -// ifdef to replace windows stuff for handles-JW +#ifdef WIN32 +# include "extgl.h" +#else typedef void *HANDLE; typedef HANDLE *PHANDLE; #define DECLARE_HANDLE(n) typedef HANDLE n - DECLARE_HANDLE(HGLRC); -// end of ifdef +#endif class SkyContext; class SkyMaterial; diff --git a/simgear/scene/sky/clouds3d/SkyLight.cpp b/simgear/scene/sky/clouds3d/SkyLight.cpp index 0c0ca0aa..6281da8e 100644 --- a/simgear/scene/sky/clouds3d/SkyLight.cpp +++ b/simgear/scene/sky/clouds3d/SkyLight.cpp @@ -19,7 +19,17 @@ * * Implementation of a class that maintains the state and operation of a light. */ -// #pragma warning( disable : 4786) + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef WIN32 +# ifdef _MSC_VER +# pragma warning( disable : 4786) +# endif +# include "extgl.h" +#endif #include "SkyLight.hpp" #include "SkyMaterial.hpp" diff --git a/simgear/scene/sky/clouds3d/SkyRenderableInstanceCloud.cpp b/simgear/scene/sky/clouds3d/SkyRenderableInstanceCloud.cpp index b83f0f12..df4650e1 100644 --- a/simgear/scene/sky/clouds3d/SkyRenderableInstanceCloud.cpp +++ b/simgear/scene/sky/clouds3d/SkyRenderableInstanceCloud.cpp @@ -238,7 +238,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal FAIL_RETURN(DisplayWithoutImpostor(Camera::Camera())); } else - { //cout << "Using impostor image\n"; + {//cout << "Using impostor image\n"; if (!_pBackTexture || (bDisplayFrontOfSplit && !_pFrontTexture)) FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyRenderableInstanceCloud::Display(): missing texture!"); @@ -268,7 +268,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal Vec3f x, y, z; if (!_bScreenImpostor) - { //cout << "Outside the cloud\n"; + {//cout << "Outside the cloud\n"; z = _vecPosition; z -= _impostorCam.Orig; z.Normalize(); diff --git a/simgear/scene/sky/clouds3d/SkyRenderableInstanceGroup.cpp b/simgear/scene/sky/clouds3d/SkyRenderableInstanceGroup.cpp index 2fa497a8..0764ddcf 100644 --- a/simgear/scene/sky/clouds3d/SkyRenderableInstanceGroup.cpp +++ b/simgear/scene/sky/clouds3d/SkyRenderableInstanceGroup.cpp @@ -115,7 +115,7 @@ SKYRESULT SkyRenderableInstanceGroup::Display() { FAIL_RETURN((*ii)->Display()); } - ***/ +***/ _pObjectSpaceBV->Display(); glMatrixMode(GL_MODELVIEW); diff --git a/simgear/scene/sky/clouds3d/SkySceneLoader.cpp b/simgear/scene/sky/clouds3d/SkySceneLoader.cpp index ad9af546..356a8de5 100644 --- a/simgear/scene/sky/clouds3d/SkySceneLoader.cpp +++ b/simgear/scene/sky/clouds3d/SkySceneLoader.cpp @@ -102,15 +102,21 @@ SkySceneLoader::~SkySceneLoader() bool SkySceneLoader::Load(std::string filename) { SkyArchive archive; + cout << "SkySceneLoader::Load( " << filename << " )" << endl; if (SKYFAILED(archive.Load(filename.c_str()))) { cout << "Archive file not found\n"; - return false; } + return false; + } char *pFilename; // Need to create the managers + cout << "GraphicsContext::Instantiate();" << endl; GraphicsContext::Instantiate(); + cout << " TextureManager::Instantiate();" << endl; TextureManager::Instantiate(); + cout << " DynamicTextureManager::Instantiate();" << endl; DynamicTextureManager::Instantiate(); + cout << " SceneManager::Instantiate();" << endl; SceneManager::Instantiate(); unsigned int iNumFiles; @@ -118,7 +124,7 @@ bool SkySceneLoader::Load(std::string filename) { for (unsigned int i = 0; i < iNumFiles; ++i) { - FAIL_RETURN(archive.FindString("CloudFile", &pFilename, i)); + FAIL_RETURN(archive.FindString("CloudFile", &pFilename, i)); float rScale = 1.0; FAIL_RETURN(archive.FindFloat32("CloudScale", &rScale, i)); rScale = 30.0; diff --git a/simgear/scene/sky/clouds3d/SkySceneManager.cpp b/simgear/scene/sky/clouds3d/SkySceneManager.cpp index 26af872b..45316f95 100644 --- a/simgear/scene/sky/clouds3d/SkySceneManager.cpp +++ b/simgear/scene/sky/clouds3d/SkySceneManager.cpp @@ -47,7 +47,7 @@ */ SkySceneManager::SkySceneManager() : /*_pSkyBox(NULL), - _pTerrain(NULL), */ + _pTerrain(NULL),*/ _bDrawLights(false), _bDrawTree(false), _bReshadeClouds(true) @@ -408,7 +408,7 @@ SKYRESULT SkySceneManager::Display( const Camera &cam ) //li->second->Display(); } - //if (_bDrawTree) // force the issue and draw + //if (_bDrawTree)// force the issue and draw //_VisualizeCloudBVTree(cam, _cloudBVTree.GetRoot()); glLineWidth(2.0); @@ -516,7 +516,7 @@ SKYRESULT SkySceneManager::LoadClouds(SkyArchive& cloudArchive, float rScale /* SkyArchive subArchive; //iNumClouds = 5; //set this value to reduce cloud field for debugging for (int i = 0; i < iNumClouds; ++i) - { printf("Loading # %d of %d clouds\n", i+1, iNumClouds); + {printf("Loading # %d of %d clouds\n", i+1, iNumClouds); cloudArchive.FindArchive("Cloud", &subArchive, i); SkyCloud *pCloud = new SkyCloud(); pCloud->Load(subArchive, rScale); @@ -596,7 +596,7 @@ void SkySceneManager::_ViewFrustumCullClouds(const Camera& cam, const CloudBVTre int i; int iResult = CamMinMaxBoxOverlap(&cam, pNode->GetNodeBV().GetMin(), pNode->GetNodeBV().GetMax()); - //iResult = COMPLETEIN; // just a hack to force the issue + //iResult = COMPLETEIN; // just a hack to force the issue if (COMPLETEIN == iResult) { // trivially add all instances diff --git a/simgear/scene/sky/clouds3d/SkyTextureManager.cpp b/simgear/scene/sky/clouds3d/SkyTextureManager.cpp index 92f01797..1844a990 100644 --- a/simgear/scene/sky/clouds3d/SkyTextureManager.cpp +++ b/simgear/scene/sky/clouds3d/SkyTextureManager.cpp @@ -214,7 +214,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename, IMAGE_TGA }; ImageType eType; - /**** +/**** // first get the image type from its extension. if (filename.find(".tga") != string.npos || filename.find(".TGA") != string.npos) eType = IMAGE_TGA; @@ -222,7 +222,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename, eType = IMAGE_PPM; else FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureManager error: invalid image format"); - ****/ + ****/ // first try the filename sent in in case it includes a path. //if (FileUtils::FileExists(filename.c_str())) //{ @@ -239,7 +239,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename, break; default: break; - } */ + }*/ //} @@ -274,7 +274,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename, break; default: break; - } */ + }*/ //if (pImageData) //break; -- 2.39.5