Norman's most recent 3d clouds code tweaks.
This commit is contained in:
@@ -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"
|
||||||
|
|||||||
@@ -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.");
|
||||||
|
|||||||
@@ -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 */)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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()
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
ContextMaterialIterator cmi = _currentMaterials.find(wglGetCurrentContext());
|
||||||
|
#else
|
||||||
ContextMaterialIterator cmi = _currentMaterials.find(glXGetCurrentContext());
|
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()
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
ContextTextureStateIterator ctsi = _currentTextureState.find(wglGetCurrentContext());
|
||||||
|
#else
|
||||||
ContextTextureStateIterator ctsi = _currentTextureState.find(glXGetCurrentContext());
|
ContextTextureStateIterator ctsi = _currentTextureState.find(glXGetCurrentContext());
|
||||||
|
#endif
|
||||||
if (_currentTextureState.end() != ctsi)
|
if (_currentTextureState.end() != ctsi)
|
||||||
return ctsi->second;
|
return ctsi->second;
|
||||||
else
|
else
|
||||||
@@ -170,14 +185,21 @@ SkyTextureState* SkyContext::GetCurrentTextureState()
|
|||||||
SKYRESULT SkyContext::AddCurrentGLContext()
|
SKYRESULT SkyContext::AddCurrentGLContext()
|
||||||
{
|
{
|
||||||
SkyMaterial *pCurrentMaterial = new SkyMaterial;
|
SkyMaterial *pCurrentMaterial = new SkyMaterial;
|
||||||
|
#ifdef WIN32
|
||||||
|
_currentMaterials.insert(std::make_pair(wglGetCurrentContext(), pCurrentMaterial));
|
||||||
|
#else
|
||||||
_currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial));
|
_currentMaterials.insert(std::make_pair(glXGetCurrentContext(), pCurrentMaterial));
|
||||||
|
#endif
|
||||||
|
|
||||||
SkyTextureState *pCurrentTS = new SkyTextureState;
|
SkyTextureState *pCurrentTS = new SkyTextureState;
|
||||||
|
#ifdef WIN32
|
||||||
|
_currentTextureState.insert(std::make_pair(wglGetCurrentContext() , pCurrentTS));
|
||||||
|
#else
|
||||||
_currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS));
|
_currentTextureState.insert(std::make_pair(glXGetCurrentContext() , pCurrentTS));
|
||||||
|
#endif
|
||||||
return SKYRESULT_OK;
|
return SKYRESULT_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Function : SkyContext::Register
|
// Function : SkyContext::Register
|
||||||
// Description :
|
// Description :
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user