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

View File

@@ -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"

View File

@@ -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 \

View File

@@ -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.");

View File

@@ -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 */)

View File

@@ -33,6 +33,8 @@
#include "SkyArchive.hpp"
#include "mat33.hpp"
#include <plib/sg.h>
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);

View File

@@ -19,8 +19,15 @@
*
* Graphics Context Interface. Initializes GL extensions, etc.
*/
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#endif
#include <GL/glut.h>
#ifndef WIN32
#include <GL/glx.h>
#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

View File

@@ -22,27 +22,28 @@
#ifndef __SKYCONTEXT_HPP__
#define __SKYCONTEXT_HPP__
#ifdef HAVE_CONFIG_H
# include <simgear_config.h>
#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 <list>
#include <map>
#include <algorithm>
// 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;

View File

@@ -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 <simgear_config.h>
#endif
#ifdef WIN32
# ifdef _MSC_VER
# pragma warning( disable : 4786)
# endif
# include "extgl.h"
#endif
#include "SkyLight.hpp"
#include "SkyMaterial.hpp"

View File

@@ -238,7 +238,7 @@ SKYRESULT SkyRenderableInstanceCloud::Display(bool bDisplayFrontOfSplit /* = fal
FAIL_RETURN(DisplayWithoutImpostor(Camera::Camera()));
}
else
{
{//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)
if (!_bScreenImpostor)
{//cout << "Outside the cloud\n";
z = _vecPosition;
z -= _impostorCam.Orig;
z.Normalize();

View File

@@ -115,7 +115,7 @@ SKYRESULT SkyRenderableInstanceGroup::Display()
{
FAIL_RETURN((*ii)->Display());
}
***/
_pObjectSpaceBV->Display();
glMatrixMode(GL_MODELVIEW);

View File

@@ -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;

View File

@@ -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
//_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)
//iNumClouds = 5; //set this value to reduce cloud field for debugging
{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());
int i;
//iResult = COMPLETEIN; // just a hack to force the issue
if (COMPLETEIN == iResult)
{
// trivially add all instances

View File

@@ -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");
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;
default:
}*/
//}
@@ -274,7 +274,7 @@ SKYRESULT SkyTextureManager::Clone2DTexture(const string &filename,
break;
default:
break;
break;
}*/
//if (pImageData)
//break;