Norman's most recent 3d clouds code tweaks.

This commit is contained in:
curt
2002-09-18 14:24:19 +00:00
parent fcf1d34e55
commit ed26458a24
13 changed files with 162 additions and 33 deletions
+2
View File
@@ -167,6 +167,8 @@ fi
dnl check for OpenGL related libraries dnl check for OpenGL related libraries
AM_CONDITIONAL(EXTGL_NEEDED, test "x$ac_cv_header_windows_h" = "xyes")
if test "x$HOSTTYPE" = "xmacintosh" ; then if test "x$HOSTTYPE" = "xmacintosh" ; then
dnl Macintosh OSX dnl Macintosh OSX
LIBS="$LIBS -framework OpenGL -framework GLUT" LIBS="$LIBS -framework OpenGL -framework GLUT"
+8
View File
@@ -1,5 +1,12 @@
includedir = @includedir@/sky/clouds3d includedir = @includedir@/sky/clouds3d
EXTRA_DIST = extlg.c
if EXTGL_NEEDED
EXTGL_SOURCE = extgl.c
else
EXTGL_SOURCE =
endif
lib_LIBRARIES = libsgclouds3d.a lib_LIBRARIES = libsgclouds3d.a
include_HEADERS = \ include_HEADERS = \
@@ -7,6 +14,7 @@ include_HEADERS = \
SkyUtil.hpp SkyUtil.hpp
libsgclouds3d_a_SOURCES = \ libsgclouds3d_a_SOURCES = \
$(EXTRA_SOURCE) \
vec3fv.cpp \ vec3fv.cpp \
mat16fv.cpp \ mat16fv.cpp \
tri.cpp \ tri.cpp \
@@ -963,6 +963,10 @@ SKYRESULT SkyArchive::Load(const char* pFileName)
FAIL_RETURN_MSG(SKYRESULT_FAIL, "Error: SkyArchive::Load(): file name is NULL."); FAIL_RETURN_MSG(SKYRESULT_FAIL, "Error: SkyArchive::Load(): file name is NULL.");
} }
FILE* pSrcFile = NULL; FILE* pSrcFile = NULL;
char buf[512];
sprintf(buf,"SkyArchive::Load(%s)",pFileName);
SkyTrace(buf);
if (NULL == (pSrcFile = fopen(pFileName, "rb"))) // file opened successfully if (NULL == (pSrcFile = fopen(pFileName, "rb"))) // file opened successfully
{ {
SkyTrace("Error: SkyArchive::Load(): failed to open file for reading."); SkyTrace("Error: SkyArchive::Load(): failed to open file for reading.");
+72
View File
@@ -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. * 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, SKYRESULT SkyCloud::Load(const SkyArchive &archive,
float rScale /* = 1.0f */, float rScale /* = 1.0f */,
bool bLocal /* = false */) bool bLocal /* = false */)
+4
View File
@@ -33,6 +33,8 @@
#include "SkyArchive.hpp" #include "SkyArchive.hpp"
#include "mat33.hpp" #include "mat33.hpp"
#include <plib/sg.h>
class SkyMaterial; class SkyMaterial;
class SkyLight; class SkyLight;
class SkyRenderableInstance; class SkyRenderableInstance;
@@ -97,6 +99,8 @@ public:
SKYRESULT Save(SkyArchive &archive) const; SKYRESULT Save(SkyArchive &archive) const;
SKYRESULT Load(const SkyArchive &archive, float rScale = 1.0f, bool bLocal = false); 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 Rotate(const Mat33f& rot);
void Translate(const Vec3f& trans); void Translate(const Vec3f& trans);
+31 -9
View File
@@ -19,8 +19,15 @@
* *
* Graphics Context Interface. Initializes GL extensions, etc. * Graphics Context Interface. Initializes GL extensions, etc.
*/ */
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <GL/glut.h> #include <GL/glut.h>
#ifndef WIN32
#include <GL/glx.h> #include <GL/glx.h>
#endif
//#include "extgl.h" //#include "extgl.h"
@@ -46,7 +53,7 @@ SkyContext::SkyContext()
// materials and structure classes // materials and structure classes
AddCurrentGLContext(); AddCurrentGLContext();
// Initialize all the extensions and load the functions - JW (file is extgl.c) // Initialize all the extensions and load the functions - JW (file is extgl.c)
#ifdef _WIN32 #ifdef WIN32
glInitialize(); glInitialize();
InitializeExtension("GL_ARB_multitexture"); InitializeExtension("GL_ARB_multitexture");
#endif #endif
@@ -122,7 +129,11 @@ SKYRESULT SkyContext::InitializeExtension(const char *pExtensionName)
*/ */
SkyMaterial* SkyContext::GetCurrentMaterial() 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) if (_currentMaterials.end() != cmi)
return cmi->second; return cmi->second;
else else
@@ -146,7 +157,11 @@ SkyMaterial* SkyContext::GetCurrentMaterial()
*/ */
SkyTextureState* SkyContext::GetCurrentTextureState() 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) if (_currentTextureState.end() != ctsi)
return ctsi->second; return ctsi->second;
else else
@@ -169,15 +184,22 @@ SkyTextureState* SkyContext::GetCurrentTextureState()
*/ */
SKYRESULT SkyContext::AddCurrentGLContext() SKYRESULT SkyContext::AddCurrentGLContext()
{ {
SkyMaterial *pCurrentMaterial = new SkyMaterial; SkyMaterial *pCurrentMaterial = new SkyMaterial;
_currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial)); #ifdef WIN32
_currentMaterials.insert(std::make_pair(wglGetCurrentContext(), pCurrentMaterial));
#else
_currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial));
#endif
SkyTextureState *pCurrentTS = new SkyTextureState; SkyTextureState *pCurrentTS = new SkyTextureState;
_currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS)); #ifdef WIN32
return SKYRESULT_OK; _currentTextureState.insert(std::make_pair(wglGetCurrentContext() , pCurrentTS));
#else
_currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS));
#endif
return SKYRESULT_OK;
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
// Function : SkyContext::Register // Function : SkyContext::Register
// Description : // Description :
+9 -8
View File
@@ -22,27 +22,28 @@
#ifndef __SKYCONTEXT_HPP__ #ifndef __SKYCONTEXT_HPP__
#define __SKYCONTEXT_HPP__ #define __SKYCONTEXT_HPP__
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
// warning for truncation of template name for browse info // warning for truncation of template name for browse info
#pragma warning( disable : 4786) // #pragma warning( disable : 4786)
#include "SkySingleton.hpp" #include "SkySingleton.hpp"
#ifdef _WIN32
#include "extgl.h"
#endif
#include <list> #include <list>
#include <map> #include <map>
#include <algorithm> #include <algorithm>
// ifdef to replace windows stuff for handles-JW #ifdef WIN32
# include "extgl.h"
#else
typedef void *HANDLE; typedef void *HANDLE;
typedef HANDLE *PHANDLE; typedef HANDLE *PHANDLE;
#define DECLARE_HANDLE(n) typedef HANDLE n #define DECLARE_HANDLE(n) typedef HANDLE n
DECLARE_HANDLE(HGLRC); DECLARE_HANDLE(HGLRC);
// end of ifdef #endif
class SkyContext; class SkyContext;
class SkyMaterial; class SkyMaterial;
+11 -1
View File
@@ -19,7 +19,17 @@
* *
* Implementation of a class that maintains the state and operation of a light. * Implementation of a class that maintains the state and operation of a light.
*/ */
// #pragma warning( disable : 4786)
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#ifdef WIN32
# ifdef _MSC_VER
# pragma warning( disable : 4786)
# endif
# include "extgl.h"
#endif
#include "SkyLight.hpp" #include "SkyLight.hpp"
#include "SkyMaterial.hpp" #include "SkyMaterial.hpp"
@@ -238,7 +238,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal
FAIL_RETURN(DisplayWithoutImpostor(Camera::Camera())); FAIL_RETURN(DisplayWithoutImpostor(Camera::Camera()));
} }
else else
{␍//cout << "Using impostor image\n"; {//cout << "Using impostor image\n";
if (!_pBackTexture || (bDisplayFrontOfSplit && !_pFrontTexture)) if (!_pBackTexture || (bDisplayFrontOfSplit && !_pFrontTexture))
FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyRenderableInstanceCloud::Display(): missing texture!"); FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyRenderableInstanceCloud::Display(): missing texture!");
@@ -268,7 +268,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal
Vec3f x, y, z; Vec3f x, y, z;
if (!_bScreenImpostor) if (!_bScreenImpostor)
{␍//cout << "Outside the cloud\n"; {//cout << "Outside the cloud\n";
z = _vecPosition; z = _vecPosition;
z -= _impostorCam.Orig; z -= _impostorCam.Orig;
z.Normalize(); z.Normalize();
@@ -115,7 +115,7 @@ SKYRESULT SkyRenderableInstanceGroup::Display()
{ {
FAIL_RETURN((*ii)->Display()); FAIL_RETURN((*ii)->Display());
} }
␍***/ ***/
_pObjectSpaceBV->Display(); _pObjectSpaceBV->Display();
glMatrixMode(GL_MODELVIEW); glMatrixMode(GL_MODELVIEW);
@@ -102,15 +102,21 @@ SkySceneLoader::~SkySceneLoader()
bool SkySceneLoader::Load(std::string filename) bool SkySceneLoader::Load(std::string filename)
{ {
SkyArchive archive; SkyArchive archive;
cout << "SkySceneLoader::Load( " << filename << " )" << endl;
if (SKYFAILED(archive.Load(filename.c_str()))) { if (SKYFAILED(archive.Load(filename.c_str()))) {
cout << "Archive file not found\n"; cout << "Archive file not found\n";
return false; } return false;
}
char *pFilename; char *pFilename;
// Need to create the managers // Need to create the managers
cout << "GraphicsContext::Instantiate();" << endl;
GraphicsContext::Instantiate(); GraphicsContext::Instantiate();
cout << " TextureManager::Instantiate();" << endl;
TextureManager::Instantiate(); TextureManager::Instantiate();
cout << " DynamicTextureManager::Instantiate();" << endl;
DynamicTextureManager::Instantiate(); DynamicTextureManager::Instantiate();
cout << " SceneManager::Instantiate();" << endl;
SceneManager::Instantiate(); SceneManager::Instantiate();
unsigned int iNumFiles; unsigned int iNumFiles;
@@ -47,7 +47,7 @@
*/ */
SkySceneManager::SkySceneManager() SkySceneManager::SkySceneManager()
: /*_pSkyBox(NULL), : /*_pSkyBox(NULL),
_pTerrain(NULL),␍*/ _pTerrain(NULL),*/
_bDrawLights(false), _bDrawLights(false),
_bDrawTree(false), _bDrawTree(false),
_bReshadeClouds(true) _bReshadeClouds(true)
@@ -408,7 +408,7 @@ SKYRESULT SkySceneManager::Display( const Camera &cam )
//li->second->Display(); //li->second->Display();
} }
//if (_bDrawTree)␍// force the issue and draw //if (_bDrawTree)// force the issue and draw
//_VisualizeCloudBVTree(cam, _cloudBVTree.GetRoot()); //_VisualizeCloudBVTree(cam, _cloudBVTree.GetRoot());
glLineWidth(2.0); glLineWidth(2.0);
@@ -516,7 +516,7 @@ SKYRESULT SkySceneManager::LoadClouds(SkyArchive& cloudArchive, float rScale /*
SkyArchive subArchive; SkyArchive subArchive;
//iNumClouds = 5; //set this value to reduce cloud field for debugging //iNumClouds = 5; //set this value to reduce cloud field for debugging
for (int i = 0; i < iNumClouds; ++i) 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); cloudArchive.FindArchive("Cloud", &subArchive, i);
SkyCloud *pCloud = new SkyCloud(); SkyCloud *pCloud = new SkyCloud();
pCloud->Load(subArchive, rScale); pCloud->Load(subArchive, rScale);
@@ -596,7 +596,7 @@ void SkySceneManager::_ViewFrustumCullClouds(const Camera& cam, const CloudBVTre
int i; int i;
int iResult = CamMinMaxBoxOverlap(&cam, pNode->GetNodeBV().GetMin(), pNode->GetNodeBV().GetMax()); 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) if (COMPLETEIN == iResult)
{ {
// trivially add all instances // trivially add all instances
@@ -214,7 +214,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename,
IMAGE_TGA IMAGE_TGA
}; };
ImageType eType; ImageType eType;
␍/**** /****
// first get the image type from its extension. // first get the image type from its extension.
if (filename.find(".tga") != string.npos || filename.find(".TGA") != string.npos) if (filename.find(".tga") != string.npos || filename.find(".TGA") != string.npos)
eType = IMAGE_TGA; eType = IMAGE_TGA;
@@ -222,7 +222,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename,
eType = IMAGE_PPM; eType = IMAGE_PPM;
else else
FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureManager error: invalid image format"); FAIL_RETURN_MSG(SKYRESULT_FAIL, "SkyTextureManager error: invalid image format");
␍****/ ****/
// first try the filename sent in in case it includes a path. // first try the filename sent in in case it includes a path.
//if (FileUtils::FileExists(filename.c_str())) //if (FileUtils::FileExists(filename.c_str()))
//{ //{
@@ -239,7 +239,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename,
break; break;
default: default:
break; break;
}␍*/ }*/
//} //}
@@ -274,7 +274,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename,
break; break;
default: default:
break; break;
}␍*/ }*/
//if (pImageData) //if (pImageData)
//break; //break;