Need to test: localassetbrowser preview related floaters hgfloatertexteditor maps media textures! Currently very hacky web browser alpha masks on avatars bumpmaps Are all sky components appearing? LLViewerDynamicTexture (texture baking, browser, animated textures, anim previews, etc) Snapshot related features Customize avatar vfs floater UI textures in general Texture priority issues
268 lines
9.4 KiB
C++
268 lines
9.4 KiB
C++
/**
|
|
* @file llsurface.h
|
|
* @brief Description of LLSurface class
|
|
*
|
|
* $LicenseInfo:firstyear=2000&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2000-2009, Linden Research, Inc.
|
|
*
|
|
* Second Life Viewer Source Code
|
|
* The source code in this file ("Source Code") is provided by Linden Lab
|
|
* to you under the terms of the GNU General Public License, version 2.0
|
|
* ("GPL"), unless you have obtained a separate licensing agreement
|
|
* ("Other License"), formally executed by you and Linden Lab. Terms of
|
|
* the GPL can be found in doc/GPL-license.txt in this distribution, or
|
|
* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
|
|
*
|
|
* There are special exceptions to the terms and conditions of the GPL as
|
|
* it is applied to this Source Code. View the full text of the exception
|
|
* in the file doc/FLOSS-exception.txt in this software distribution, or
|
|
* online at
|
|
* http://secondlifegrid.net/programs/open_source/licensing/flossexception
|
|
*
|
|
* By copying, modifying or distributing this software, you acknowledge
|
|
* that you have read and understood your obligations described above,
|
|
* and agree to abide by those obligations.
|
|
*
|
|
* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
|
|
* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
|
|
* COMPLETENESS OR PERFORMANCE.
|
|
* $/LicenseInfo$
|
|
*/
|
|
|
|
#ifndef LL_LLSURFACE_H
|
|
#define LL_LLSURFACE_H
|
|
|
|
//#include "vmath.h"
|
|
#include "v3math.h"
|
|
#include "v3dmath.h"
|
|
#include "v4math.h"
|
|
#include "m3math.h"
|
|
#include "m4math.h"
|
|
#include "llquaternion.h"
|
|
|
|
#include "v4coloru.h"
|
|
#include "v4color.h"
|
|
|
|
#include "llvowater.h"
|
|
#include "llpatchvertexarray.h"
|
|
#include "llviewertexture.h"
|
|
|
|
class LLTimer;
|
|
class LLUUID;
|
|
class LLAgent;
|
|
class LLStat;
|
|
|
|
static const U8 NO_EDGE = 0x00;
|
|
static const U8 EAST_EDGE = 0x01;
|
|
static const U8 NORTH_EDGE = 0x02;
|
|
static const U8 WEST_EDGE = 0x04;
|
|
static const U8 SOUTH_EDGE = 0x08;
|
|
|
|
static const S32 ONE_MORE_THAN_NEIGHBOR = 1;
|
|
static const S32 EQUAL_TO_NEIGHBOR = 0;
|
|
static const S32 ONE_LESS_THAN_NEIGHBOR = -1;
|
|
|
|
const S32 ABOVE_WATERLINE_ALPHA = 32; // The alpha of water when the land elevation is above the waterline.
|
|
|
|
class LLViewerRegion;
|
|
class LLSurfacePatch;
|
|
class LLBitPack;
|
|
class LLGroupHeader;
|
|
|
|
class LLSurface
|
|
{
|
|
public:
|
|
LLSurface(U32 type, LLViewerRegion *regionp = NULL);
|
|
virtual ~LLSurface();
|
|
|
|
static void initClasses(); // Do class initialization for LLSurface and its child classes.
|
|
|
|
void create(const S32 surface_grid_width,
|
|
const S32 surface_patch_width,
|
|
const LLVector3d &origin_global,
|
|
const F32 width); // Allocates and initializes surface
|
|
|
|
void setRegion(LLViewerRegion *regionp);
|
|
|
|
void setOriginGlobal(const LLVector3d &origin_global);
|
|
|
|
void connectNeighbor(LLSurface *neighborp, U32 direction);
|
|
void disconnectNeighbor(LLSurface *neighborp);
|
|
void disconnectAllNeighbors();
|
|
|
|
virtual void decompressDCTPatch(LLBitPack &bitpack, LLGroupHeader *gopp, BOOL b_large_patch);
|
|
virtual void updatePatchVisibilities(LLAgent &agent);
|
|
|
|
inline F32 getZ(const U32 k) const { return mSurfaceZ[k]; }
|
|
inline F32 getZ(const S32 i, const S32 j) const { return mSurfaceZ[i + j*mGridsPerEdge]; }
|
|
|
|
LLVector3 getOriginAgent() const;
|
|
const LLVector3d &getOriginGlobal() const;
|
|
F32 getMetersPerGrid() const;
|
|
S32 getGridsPerEdge() const;
|
|
S32 getPatchesPerEdge() const;
|
|
S32 getGridsPerPatchEdge() const;
|
|
U32 getRenderStride(const U32 render_level) const;
|
|
U32 getRenderLevel(const U32 render_stride) const;
|
|
|
|
// Returns the height of the surface immediately above (or below) location,
|
|
// or if location is not above surface returns zero.
|
|
F32 resolveHeightRegion(const F32 x, const F32 y) const;
|
|
F32 resolveHeightRegion(const LLVector3 &location) const
|
|
{ return resolveHeightRegion( location.mV[VX], location.mV[VY] ); }
|
|
F32 resolveHeightGlobal(const LLVector3d &position_global) const;
|
|
LLVector3 resolveNormalGlobal(const LLVector3d& v) const; // Returns normal to surface
|
|
|
|
LLSurfacePatch *resolvePatchRegion(const F32 x, const F32 y) const;
|
|
LLSurfacePatch *resolvePatchRegion(const LLVector3 &position_region) const;
|
|
LLSurfacePatch *resolvePatchGlobal(const LLVector3d &position_global) const;
|
|
|
|
// Update methods (called during idle, normally)
|
|
BOOL idleUpdate(F32 max_update_time);
|
|
|
|
BOOL containsPosition(const LLVector3 &position);
|
|
|
|
void moveZ(const S32 x, const S32 y, const F32 delta);
|
|
|
|
LLViewerRegion *getRegion() const { return mRegionp; }
|
|
|
|
F32 getMinZ() const { return mMinZ; }
|
|
F32 getMaxZ() const { return mMaxZ; }
|
|
|
|
void setWaterHeight(F32 height);
|
|
F32 getWaterHeight() const;
|
|
|
|
LLViewerTexture *getSTexture();
|
|
LLViewerTexture *getWaterTexture();
|
|
BOOL hasZData() const { return mHasZData; }
|
|
|
|
void dirtyAllPatches(); // Use this to dirty all patches when changing terrain parameters
|
|
|
|
void dirtySurfacePatch(LLSurfacePatch *patchp);
|
|
LLVOWater *getWaterObj() { return mWaterObjp; }
|
|
|
|
static void setTextureSize(const S32 texture_size);
|
|
|
|
friend class LLSurfacePatch;
|
|
friend std::ostream& operator<<(std::ostream &s, const LLSurface &S);
|
|
public:
|
|
// Number of grid points on one side of a region, including +1 buffer for
|
|
// north and east edge.
|
|
S32 mGridsPerEdge;
|
|
|
|
F32 mOOGridsPerEdge; // Inverse of grids per edge
|
|
|
|
S32 mPatchesPerEdge; // Number of patches on one side of a region
|
|
S32 mNumberOfPatches; // Total number of patches
|
|
|
|
|
|
// Each surface points at 8 neighbors (or NULL)
|
|
// +---+---+---+
|
|
// |NW | N | NE|
|
|
// +---+---+---+
|
|
// | W | 0 | E |
|
|
// +---+---+---+
|
|
// |SW | S | SE|
|
|
// +---+---+---+
|
|
LLSurface *mNeighbors[8]; // Adjacent patches
|
|
|
|
U32 mType; // Useful for identifying derived classes
|
|
|
|
F32 mDetailTextureScale; // Number of times to repeat detail texture across this surface
|
|
|
|
static F32 sTextureUpdateTime;
|
|
static S32 sTexelsUpdated;
|
|
static LLStat sTexelsUpdatedPerSecStat;
|
|
|
|
protected:
|
|
void createSTexture();
|
|
void createWaterTexture();
|
|
void initTextures();
|
|
void initWater();
|
|
|
|
|
|
void createPatchData(); // Allocates memory for patches.
|
|
void destroyPatchData(); // Deallocates memory for patches.
|
|
|
|
BOOL generateWaterTexture(const F32 x, const F32 y,
|
|
const F32 width, const F32 height); // Generate texture from composition values.
|
|
|
|
//F32 updateTexture(LLSurfacePatch *ppatch);
|
|
|
|
LLSurfacePatch *getPatch(const S32 x, const S32 y) const;
|
|
|
|
protected:
|
|
LLVector3d mOriginGlobal; // In absolute frame
|
|
LLSurfacePatch *mPatchList; // Array of all patches
|
|
|
|
// Array of grid data, mGridsPerEdge * mGridsPerEdge
|
|
F32 *mSurfaceZ;
|
|
|
|
// Array of grid normals, mGridsPerEdge * mGridsPerEdge
|
|
LLVector3 *mNorm;
|
|
|
|
std::set<LLSurfacePatch *> mDirtyPatchList;
|
|
|
|
|
|
// The textures should never be directly initialized - use the setter methods!
|
|
LLPointer<LLViewerTexture> mSTexturep; // Texture for surface
|
|
LLPointer<LLViewerTexture> mWaterTexturep; // Water texture
|
|
|
|
LLPointer<LLVOWater> mWaterObjp;
|
|
|
|
// When we want multiple cameras we'll need one of each these for each camera
|
|
S32 mVisiblePatchCount;
|
|
|
|
U32 mGridsPerPatchEdge; // Number of grid points on a side of a patch
|
|
F32 mMetersPerGrid; // Converts (i,j) indecies to distance
|
|
F32 mMetersPerEdge; // = mMetersPerGrid * (mGridsPerEdge-1)
|
|
|
|
LLPatchVertexArray mPVArray;
|
|
|
|
BOOL mHasZData; // We've received any patch data for this surface.
|
|
F32 mMinZ; // min z for this region (during the session)
|
|
F32 mMaxZ; // max z for this region (during the session)
|
|
|
|
S32 mSurfacePatchUpdateCount; // Number of frames since last update.
|
|
|
|
private:
|
|
LLViewerRegion *mRegionp; // Patch whose coordinate system this surface is using.
|
|
static S32 sTextureSize; // Size of the surface texture
|
|
};
|
|
|
|
|
|
|
|
// . __.
|
|
// Z /|\ /| Y North
|
|
// | /
|
|
// | / |<----------------- mGridsPerSurfaceEdge --------------->|
|
|
// | / __________________________________________________________
|
|
// |/______\ X /_______________________________________________________ /
|
|
// / / / / / / / /M*M-2 /M*M-1 / /
|
|
// /______/______/______/______/______/______/______/______/ /
|
|
// / / / / / / / / / /
|
|
// /______/______/______/______/______/______/______/______/ /
|
|
// / / / / / / / / / /
|
|
// /______/______/______/______/______/______/______/______/ /
|
|
// West / / / / / / / / / /
|
|
// /______/______/______/______/______/______/______/______/ / East
|
|
// /... / / / / / / / / /
|
|
// /______/______/______/______/______/______/______/______/ /
|
|
// _. / 2M / / / / / / / / /
|
|
// /| /______/______/______/______/______/______/______/______/ /
|
|
// / / M / M+1 / M+2 / ... / / / / 2M-1 / /
|
|
// j /______/______/______/______/______/______/______/______/ /
|
|
// / 0 / 1 / 2 / ... / / / / M-1 / /
|
|
// /______/______/______/______/______/______/______/______/_/
|
|
// South |<-L->|
|
|
// i -->
|
|
//
|
|
// where M = mSurfPatchWidth
|
|
// and L = mPatchGridWidth
|
|
//
|
|
// Notice that mGridsPerSurfaceEdge = a power of two + 1
|
|
// This provides a buffer on the east and north edges that will allow us to
|
|
// fill the cracks between adjacent surfaces when rendering.
|
|
#endif
|