Result of svn merge -r56461:56474 svn+ssh://svn/svn/linden/branches/llscene-shuffle into release.
parent
d60f16540d
commit
3be8a9cc11
|
|
@ -0,0 +1,258 @@
|
|||
/**
|
||||
* @file lllandmark.cpp
|
||||
* @brief Landmark asset class
|
||||
*
|
||||
* Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#include "linden_common.h"
|
||||
#include "lllandmark.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h> // for sscanf() on linux
|
||||
|
||||
#include "message.h"
|
||||
#include "llregionhandle.h"
|
||||
|
||||
std::pair<LLUUID, U64> LLLandmark::mLocalRegion;
|
||||
LLLandmark::region_map_t LLLandmark::mRegions;
|
||||
LLLandmark::region_callback_t LLLandmark::mRegionCallback;
|
||||
|
||||
LLLandmark::LLLandmark() :
|
||||
mGlobalPositionKnown(false)
|
||||
{
|
||||
}
|
||||
|
||||
LLLandmark::LLLandmark(const LLVector3d& pos) :
|
||||
mGlobalPositionKnown(true),
|
||||
mGlobalPos( pos )
|
||||
{
|
||||
}
|
||||
|
||||
bool LLLandmark::getGlobalPos(LLVector3d& pos)
|
||||
{
|
||||
if(mGlobalPositionKnown)
|
||||
{
|
||||
pos = mGlobalPos;
|
||||
}
|
||||
else if(mRegionID.notNull())
|
||||
{
|
||||
F32 g_x = -1.0;
|
||||
F32 g_y = -1.0;
|
||||
if(mRegionID == mLocalRegion.first)
|
||||
{
|
||||
from_region_handle(mLocalRegion.second, &g_x, &g_y);
|
||||
}
|
||||
else
|
||||
{
|
||||
region_map_t::iterator it = mRegions.find(mRegionID);
|
||||
if(it != mRegions.end())
|
||||
{
|
||||
from_region_handle((*it).second.mRegionHandle, &g_x, &g_y);
|
||||
}
|
||||
}
|
||||
if((g_x > 0.f) && (g_y > 0.f))
|
||||
{
|
||||
pos.mdV[0] = g_x + mRegionPos.mV[0];
|
||||
pos.mdV[1] = g_y + mRegionPos.mV[1];
|
||||
pos.mdV[2] = mRegionPos.mV[2];
|
||||
setGlobalPos(pos);
|
||||
}
|
||||
}
|
||||
return mGlobalPositionKnown;
|
||||
}
|
||||
|
||||
void LLLandmark::setGlobalPos(const LLVector3d& pos)
|
||||
{
|
||||
mGlobalPos = pos;
|
||||
mGlobalPositionKnown = true;
|
||||
}
|
||||
|
||||
bool LLLandmark::getRegionID(LLUUID& region_id)
|
||||
{
|
||||
if(mRegionID.notNull())
|
||||
{
|
||||
region_id = mRegionID;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
LLVector3 LLLandmark::getRegionPos() const
|
||||
{
|
||||
return mRegionPos;
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
LLLandmark* LLLandmark::constructFromString(const char *buffer)
|
||||
{
|
||||
const char* cur = buffer;
|
||||
S32 chars_read = 0;
|
||||
S32 count = 0;
|
||||
U32 version = 0;
|
||||
|
||||
// read version
|
||||
count = sscanf( cur, "Landmark version %u\n%n", &version, &chars_read );
|
||||
if(count != 1)
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
|
||||
if(version == 1)
|
||||
{
|
||||
LLVector3d pos;
|
||||
cur += chars_read;
|
||||
// read position
|
||||
count = sscanf( cur, "position %lf %lf %lf\n%n", pos.mdV+VX, pos.mdV+VY, pos.mdV+VZ, &chars_read );
|
||||
if( count != 3 )
|
||||
{
|
||||
goto error;
|
||||
}
|
||||
cur += chars_read;
|
||||
// llinfos << "Landmark read: " << pos << llendl;
|
||||
|
||||
return new LLLandmark(pos);
|
||||
}
|
||||
else if(version == 2)
|
||||
{
|
||||
char region_id_str[MAX_STRING];
|
||||
LLVector3 pos;
|
||||
cur += chars_read;
|
||||
count = sscanf(cur, "region_id %s\n%n", region_id_str, &chars_read);
|
||||
if(count != 1) goto error;
|
||||
cur += chars_read;
|
||||
count = sscanf(cur, "local_pos %f %f %f\n%n", pos.mV+VX, pos.mV+VY, pos.mV+VZ, &chars_read);
|
||||
if(count != 3) goto error;
|
||||
cur += chars_read;
|
||||
LLLandmark* lm = new LLLandmark;
|
||||
lm->mRegionID.set(region_id_str);
|
||||
lm->mRegionPos = pos;
|
||||
return lm;
|
||||
}
|
||||
|
||||
error:
|
||||
llinfos << "Bad Landmark Asset: bad _DATA_ block." << llendl;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLLandmark::registerCallbacks(LLMessageSystem* msg)
|
||||
{
|
||||
msg->setHandlerFunc("RegionIDAndHandleReply", &processRegionIDAndHandle);
|
||||
}
|
||||
|
||||
// static
|
||||
void LLLandmark::requestRegionHandle(
|
||||
LLMessageSystem* msg,
|
||||
const LLHost& upstream_host,
|
||||
const LLUUID& region_id,
|
||||
LLRegionHandleCallback* callback)
|
||||
{
|
||||
if(region_id.isNull())
|
||||
{
|
||||
// don't bother with checking - it's 0.
|
||||
lldebugs << "requestRegionHandle: null" << llendl;
|
||||
if(callback)
|
||||
{
|
||||
const U64 U64_ZERO = 0;
|
||||
callback->dataReady(region_id, U64_ZERO);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if(region_id == mLocalRegion.first)
|
||||
{
|
||||
lldebugs << "requestRegionHandle: local" << llendl;
|
||||
if(callback)
|
||||
{
|
||||
callback->dataReady(region_id, mLocalRegion.second);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
region_map_t::iterator it = mRegions.find(region_id);
|
||||
if(it == mRegions.end())
|
||||
{
|
||||
lldebugs << "requestRegionHandle: upstream" << llendl;
|
||||
if(callback)
|
||||
{
|
||||
region_callback_t::value_type vt(region_id, callback);
|
||||
mRegionCallback.insert(vt);
|
||||
}
|
||||
lldebugs << "Landmark requesting information about: "
|
||||
<< region_id << llendl;
|
||||
msg->newMessage("RegionHandleRequest");
|
||||
msg->nextBlock("RequestBlock");
|
||||
msg->addUUID("RegionID", region_id);
|
||||
msg->sendReliable(upstream_host);
|
||||
}
|
||||
else if(callback)
|
||||
{
|
||||
// we have the answer locally - just call the callack.
|
||||
lldebugs << "requestRegionHandle: ready" << llendl;
|
||||
callback->dataReady(region_id, (*it).second.mRegionHandle);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// As good a place as any to expire old entries.
|
||||
expireOldEntries();
|
||||
}
|
||||
|
||||
// static
|
||||
void LLLandmark::setRegionHandle(const LLUUID& region_id, U64 region_handle)
|
||||
{
|
||||
mLocalRegion.first = region_id;
|
||||
mLocalRegion.second = region_handle;
|
||||
}
|
||||
|
||||
|
||||
// static
|
||||
void LLLandmark::processRegionIDAndHandle(LLMessageSystem* msg, void**)
|
||||
{
|
||||
LLUUID region_id;
|
||||
msg->getUUID("ReplyBlock", "RegionID", region_id);
|
||||
mRegions.erase(region_id);
|
||||
CacheInfo info;
|
||||
const F32 CACHE_EXPIRY_SECONDS = 60.0f * 10.0f; // ten minutes
|
||||
info.mTimer.setTimerExpirySec(CACHE_EXPIRY_SECONDS);
|
||||
msg->getU64("ReplyBlock", "RegionHandle", info.mRegionHandle);
|
||||
region_map_t::value_type vt(region_id, info);
|
||||
mRegions.insert(vt);
|
||||
|
||||
#if LL_DEBUG
|
||||
U32 grid_x, grid_y;
|
||||
grid_from_region_handle(info.mRegionHandle, &grid_x, &grid_y);
|
||||
lldebugs << "Landmark got reply for region: " << region_id << " "
|
||||
<< grid_x << "," << grid_y << llendl;
|
||||
#endif
|
||||
|
||||
// make all the callbacks here.
|
||||
region_callback_t::iterator it;
|
||||
while((it = mRegionCallback.find(region_id)) != mRegionCallback.end())
|
||||
{
|
||||
(*it).second->dataReady(region_id, info.mRegionHandle);
|
||||
mRegionCallback.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
// static
|
||||
void LLLandmark::expireOldEntries()
|
||||
{
|
||||
for(region_map_t::iterator it = mRegions.begin(); it != mRegions.end(); )
|
||||
{
|
||||
if((*it).second.mTimer.hasExpired())
|
||||
{
|
||||
mRegions.erase(it++);
|
||||
}
|
||||
else
|
||||
{
|
||||
++it;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,101 @@
|
|||
/**
|
||||
* @file lllandmark.h
|
||||
* @brief Landmark asset class
|
||||
*
|
||||
* Copyright (c) 2002-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
|
||||
#ifndef LL_LLLANDMARK_H
|
||||
#define LL_LLLANDMARK_H
|
||||
|
||||
#include <map>
|
||||
#include "llframetimer.h"
|
||||
#include "lluuid.h"
|
||||
#include "v3dmath.h"
|
||||
|
||||
class LLMessageSystem;
|
||||
class LLHost;
|
||||
|
||||
// virutal base class used for calling back interested parties when a
|
||||
// region handle comes back.
|
||||
class LLRegionHandleCallback
|
||||
{
|
||||
public:
|
||||
LLRegionHandleCallback() {}
|
||||
virtual ~LLRegionHandleCallback() {}
|
||||
virtual bool dataReady(
|
||||
const LLUUID& region_id,
|
||||
const U64& region_handle)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class LLLandmark
|
||||
{
|
||||
public:
|
||||
~LLLandmark() {}
|
||||
|
||||
// returns true if the position is known.
|
||||
bool getGlobalPos(LLVector3d& pos);
|
||||
|
||||
// setter used in conjunction if more information needs to be
|
||||
// collected from the server.
|
||||
void setGlobalPos(const LLVector3d& pos);
|
||||
|
||||
// return true if the region is known
|
||||
bool getRegionID(LLUUID& region_id);
|
||||
|
||||
// return the local coordinates if known
|
||||
LLVector3 getRegionPos() const;
|
||||
|
||||
// constructs a new LLLandmark from a string
|
||||
// return NULL if there's an error
|
||||
static LLLandmark* constructFromString(const char *buffer);
|
||||
|
||||
// register callbacks that this class handles
|
||||
static void registerCallbacks(LLMessageSystem* msg);
|
||||
|
||||
// request information about region_id to region_handle.Pass in a
|
||||
// callback pointer which will be erase but NOT deleted after the
|
||||
// callback is made. This function may call into the message
|
||||
// system to get the information.
|
||||
static void requestRegionHandle(
|
||||
LLMessageSystem* msg,
|
||||
const LLHost& upstream_host,
|
||||
const LLUUID& region_id,
|
||||
LLRegionHandleCallback* callback);
|
||||
|
||||
// Call this method to create a lookup for this region. This
|
||||
// simplifies a lot of the code.
|
||||
static void setRegionHandle(const LLUUID& region_id, U64 region_handle);
|
||||
|
||||
private:
|
||||
LLLandmark();
|
||||
LLLandmark(const LLVector3d& pos);
|
||||
|
||||
static void processRegionIDAndHandle(LLMessageSystem* msg, void**);
|
||||
static void expireOldEntries();
|
||||
|
||||
private:
|
||||
LLUUID mRegionID;
|
||||
LLVector3 mRegionPos;
|
||||
bool mGlobalPositionKnown;
|
||||
LLVector3d mGlobalPos;
|
||||
|
||||
struct CacheInfo
|
||||
{
|
||||
U64 mRegionHandle;
|
||||
LLFrameTimer mTimer;
|
||||
};
|
||||
|
||||
static std::pair<LLUUID, U64> mLocalRegion;
|
||||
typedef std::map<LLUUID, CacheInfo> region_map_t;
|
||||
static region_map_t mRegions;
|
||||
typedef std::multimap<LLUUID, LLRegionHandleCallback*> region_callback_t;
|
||||
static region_callback_t mRegionCallback;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
/**
|
||||
* @file lltree_common.h
|
||||
* @brief LLTree_gene_0 base class
|
||||
*
|
||||
* Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
// Common data for trees shared between simulator and viewer
|
||||
|
||||
#ifndef LL_LLTREE_COMMON_H
|
||||
#define LL_LLTREE_COMMON_H
|
||||
|
||||
struct LLTree_gene_0
|
||||
{
|
||||
//
|
||||
// The genome for a tree, species 0
|
||||
//
|
||||
U8 scale; // Scales size of the tree ( / 50 = meter)
|
||||
U8 branches; // When tree forks, how many branches emerge?
|
||||
U8 twist; // twist about old branch axis for each branch (convert to degrees by dividing/255 * 180)
|
||||
U8 droop; // Droop away from old branch axis (convert to degrees by dividing/255 * 180)
|
||||
U8 species; // Branch coloring index
|
||||
U8 trunk_depth; // max recursions in the main trunk
|
||||
U8 branch_thickness; // Scales thickness of trunk ( / 50 = meter)
|
||||
U8 max_depth; // Branch Recursions to flower
|
||||
U8 scale_step; // How much to multiply scale size at each recursion 0-1.f to convert to float
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -0,0 +1,61 @@
|
|||
/**
|
||||
* @file object_flags.h
|
||||
* @brief Flags for object creation and transmission
|
||||
*
|
||||
* Copyright (c) 2001-$CurrentYear$, Linden Research, Inc.
|
||||
* $License$
|
||||
*/
|
||||
|
||||
#ifndef LL_OBJECT_FLAGS_H
|
||||
#define LL_OBJECT_FLAGS_H
|
||||
|
||||
// downstream flags from sim->viewer
|
||||
const U32 FLAGS_USE_PHYSICS = 0x00000001;
|
||||
const U32 FLAGS_CREATE_SELECTED = 0x00000002;
|
||||
const U32 FLAGS_OBJECT_MODIFY = 0x00000004;
|
||||
const U32 FLAGS_OBJECT_COPY = 0x00000008;
|
||||
const U32 FLAGS_OBJECT_ANY_OWNER = 0x00000010;
|
||||
const U32 FLAGS_OBJECT_YOU_OWNER = 0x00000020;
|
||||
const U32 FLAGS_SCRIPTED = 0x00000040;
|
||||
const U32 FLAGS_HANDLE_TOUCH = 0x00000080;
|
||||
const U32 FLAGS_OBJECT_MOVE = 0x00000100;
|
||||
const U32 FLAGS_TAKES_MONEY = 0x00000200;
|
||||
const U32 FLAGS_PHANTOM = 0x00000400;
|
||||
const U32 FLAGS_INVENTORY_EMPTY = 0x00000800;
|
||||
|
||||
const U32 FLAGS_JOINT_HINGE = 0x00001000;
|
||||
const U32 FLAGS_JOINT_P2P = 0x00002000;
|
||||
const U32 FLAGS_JOINT_LP2P = 0x00004000;
|
||||
//const U32 FLAGS_JOINT_WHEEL = 0x00008000;
|
||||
|
||||
const U32 FLAGS_ALLOW_INVENTORY_DROP = 0x00010000;
|
||||
const U32 FLAGS_OBJECT_TRANSFER = 0x00020000;
|
||||
const U32 FLAGS_OBJECT_GROUP_OWNED = 0x00040000;
|
||||
//const U32 FLAGS_OBJECT_YOU_OFFICER = 0x00080000;
|
||||
|
||||
const U32 FLAGS_CAMERA_DECOUPLED = 0x00100000;
|
||||
const U32 FLAGS_ANIM_SOURCE = 0x00200000;
|
||||
const U32 FLAGS_CAMERA_SOURCE = 0x00400000;
|
||||
|
||||
const U32 FLAGS_CAST_SHADOWS = 0x00800000;
|
||||
|
||||
const U32 FLAGS_OBJECT_OWNER_MODIFY = 0x10000000;
|
||||
|
||||
const U32 FLAGS_TEMPORARY_ON_REZ = 0x20000000;
|
||||
const U32 FLAGS_TEMPORARY = 0x40000000;
|
||||
const U32 FLAGS_ZLIB_COMPRESSED = 0x80000000;
|
||||
|
||||
const U32 FLAGS_LOCAL = FLAGS_ANIM_SOURCE | FLAGS_CAMERA_SOURCE;
|
||||
|
||||
typedef enum e_havok_joint_type
|
||||
{
|
||||
HJT_INVALID = 0,
|
||||
HJT_HINGE = 1,
|
||||
HJT_POINT = 2,
|
||||
// HJT_LPOINT = 3,
|
||||
// HJT_WHEEL = 4,
|
||||
HJT_EOF = 3
|
||||
} EHavokJointType;
|
||||
|
||||
#endif
|
||||
|
||||
|
|
@ -10,7 +10,6 @@
|
|||
|
||||
#include "llviewerobjectlist.h"
|
||||
|
||||
#include "gpw.h"
|
||||
#include "message.h"
|
||||
#include "timing.h"
|
||||
#include "llfasttimer.h"
|
||||
|
|
|
|||
Loading…
Reference in New Issue