summaryrefslogtreecommitdiff
path: root/indra
diff options
context:
space:
mode:
authorAaron Brashears <aaronb@lindenlab.com>2007-01-04 23:38:26 +0000
committerAaron Brashears <aaronb@lindenlab.com>2007-01-04 23:38:26 +0000
commit3be8a9cc117587157d0591194cb085ad825f8986 (patch)
treea553d165a10dc128a4ffec43f45ab28d9d8bfc78 /indra
parentd60f16540dba5616cd8260046b44ebc2a1047065 (diff)
Result of svn merge -r56461:56474 svn+ssh://svn/svn/linden/branches/llscene-shuffle into release.
Diffstat (limited to 'indra')
-rw-r--r--indra/llinventory/lllandmark.cpp258
-rw-r--r--indra/llinventory/lllandmark.h101
-rw-r--r--indra/llprimitive/lltree_common.h30
-rw-r--r--indra/llprimitive/object_flags.h61
-rw-r--r--indra/newview/llviewerobjectlist.cpp1
5 files changed, 450 insertions, 1 deletions
diff --git a/indra/llinventory/lllandmark.cpp b/indra/llinventory/lllandmark.cpp
new file mode 100644
index 0000000000..a99bd42344
--- /dev/null
+++ b/indra/llinventory/lllandmark.cpp
@@ -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;
+ }
+ }
+}
diff --git a/indra/llinventory/lllandmark.h b/indra/llinventory/lllandmark.h
new file mode 100644
index 0000000000..f0f0a0b793
--- /dev/null
+++ b/indra/llinventory/lllandmark.h
@@ -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
diff --git a/indra/llprimitive/lltree_common.h b/indra/llprimitive/lltree_common.h
new file mode 100644
index 0000000000..050a7dafa4
--- /dev/null
+++ b/indra/llprimitive/lltree_common.h
@@ -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
diff --git a/indra/llprimitive/object_flags.h b/indra/llprimitive/object_flags.h
new file mode 100644
index 0000000000..b410171742
--- /dev/null
+++ b/indra/llprimitive/object_flags.h
@@ -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
+
diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp
index e2c1bc0695..b630572a9b 100644
--- a/indra/newview/llviewerobjectlist.cpp
+++ b/indra/newview/llviewerobjectlist.cpp
@@ -10,7 +10,6 @@
#include "llviewerobjectlist.h"
-#include "gpw.h"
#include "message.h"
#include "timing.h"
#include "llfasttimer.h"