226 lines
6.3 KiB
C++
226 lines
6.3 KiB
C++
/**
|
|
* @file llpreviewlandmark.cpp
|
|
* @brief LLPreviewLandmark class implementation
|
|
*
|
|
* $LicenseInfo:firstyear=2002&license=viewergpl$
|
|
*
|
|
* Copyright (c) 2002-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$
|
|
*/
|
|
|
|
#include "llviewerprecompiledheaders.h"
|
|
|
|
#include "llpreviewlandmark.h"
|
|
|
|
#include "llassetstorage.h"
|
|
#include "llfocusmgr.h"
|
|
#include "llfontgl.h"
|
|
#include "llgl.h"
|
|
#include "llinventory.h"
|
|
#include "message.h"
|
|
|
|
#include "llagent.h"
|
|
#include "llbutton.h"
|
|
#include "lleconomy.h"
|
|
#include "llfloaterinventory.h"
|
|
#include "llfloaterworldmap.h"
|
|
#include "lliconctrl.h"
|
|
#include "lllandmarklist.h"
|
|
#include "lllineeditor.h"
|
|
#include "llpanelplace.h"
|
|
#include "llresmgr.h"
|
|
#include "llstatusbar.h"
|
|
#include "lltextbox.h"
|
|
#include "llui.h"
|
|
#include "llviewercontrol.h"
|
|
#include "llviewerregion.h"
|
|
#include "llviewerstats.h"
|
|
#include "lluictrlfactory.h"
|
|
#include "lltexturectrl.h"
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
// LLPreviewLandmark
|
|
|
|
// static
|
|
LLPreviewLandmarkList LLPreviewLandmark::sOrderedInstances;
|
|
|
|
|
|
LLPreviewLandmark::LLPreviewLandmark(const std::string& name,
|
|
const LLRect& rect,
|
|
const std::string& title,
|
|
const LLUUID& item_uuid,
|
|
BOOL show_keep_discard,
|
|
LLViewerInventoryItem* inv_item)
|
|
: LLPreview(name,
|
|
LLRect(rect.mLeft,
|
|
rect.mTop,
|
|
(show_keep_discard ? rect.mRight+70 : rect.mRight),
|
|
rect.mBottom),
|
|
title,
|
|
item_uuid,
|
|
LLUUID::null, // object id
|
|
FALSE, // allow resize
|
|
0, 0, // min dimensions
|
|
inv_item),
|
|
mLandmark( NULL )
|
|
{
|
|
|
|
mFactoryMap["place_details_panel"] = LLCallbackMap(LLPreviewLandmark::createPlaceDetail, this);
|
|
if (show_keep_discard)
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_new_landmark.xml", &getFactoryMap());
|
|
childSetAction("Discard btn",onDiscardBtn,this);
|
|
}
|
|
else
|
|
{
|
|
LLUICtrlFactory::getInstance()->buildFloater(this, "floater_preview_existing_landmark.xml", &getFactoryMap());
|
|
}
|
|
|
|
/*
|
|
childSetCommitCallback("desc_editor", LLPreview::onText, this);
|
|
childSetText("desc_editor", item->getDescription());
|
|
childSetText("name_editor", item->getName());
|
|
childSetPrevalidate("desc_editor", &LLLineEditor::prevalidatePrintableNotPipe);
|
|
|
|
setTitle(title);
|
|
|
|
if (!getHost())
|
|
{
|
|
LLRect curRect = getRect();
|
|
translate(rect.mLeft - curRect.mLeft, rect.mTop - curRect.mTop);
|
|
}
|
|
*/
|
|
LLPreviewLandmark::sOrderedInstances.push_back( this );
|
|
}
|
|
|
|
LLPreviewLandmark::~LLPreviewLandmark()
|
|
{
|
|
LLPreviewLandmarkList::iterator this_itr;
|
|
this_itr = std::find(LLPreviewLandmark::sOrderedInstances.begin(),
|
|
LLPreviewLandmark::sOrderedInstances.end(), this);
|
|
if (this_itr != LLPreviewLandmark::sOrderedInstances.end())
|
|
{
|
|
LLPreviewLandmark::sOrderedInstances.erase(this_itr);
|
|
}
|
|
}
|
|
|
|
|
|
// Distance and direction from avatar to landmark.
|
|
// Distance is in meters; degrees is angle from east (north = 90)
|
|
void LLPreviewLandmark::getDegreesAndDist( F32* degrees, F64* horiz_dist, F64* vert_dist) const
|
|
{
|
|
if( mLandmark )
|
|
{
|
|
LLVector3d pos;
|
|
if(mLandmark->getGlobalPos(pos))
|
|
{
|
|
LLVector3d to_vec = pos - gAgent.getPositionGlobal();
|
|
*horiz_dist = sqrt(to_vec.mdV[VX] * to_vec.mdV[VX] + to_vec.mdV[VY] * to_vec.mdV[VY]);
|
|
*vert_dist = to_vec.mdV[VZ];
|
|
*degrees = F32( RAD_TO_DEG * atan2( to_vec.mdV[VY], to_vec.mdV[VX] ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
const std::string& LLPreviewLandmark::getName() const
|
|
{
|
|
const LLInventoryItem *item = getItem();
|
|
if (item)
|
|
{
|
|
return item->getName();
|
|
}
|
|
return LLStringUtil::null;
|
|
}
|
|
|
|
LLVector3d LLPreviewLandmark::getPositionGlobal() const
|
|
{
|
|
LLVector3d pos;
|
|
if( mLandmark )
|
|
{
|
|
// we can safely ignore the return value here.
|
|
(void)mLandmark->getGlobalPos(pos);
|
|
}
|
|
return pos;
|
|
}
|
|
|
|
|
|
const LLColor4& LLPreviewLandmark::getMarkerColor() const
|
|
{
|
|
return mMarkerColor;
|
|
}
|
|
|
|
void LLPreviewLandmark::draw()
|
|
{
|
|
const LLInventoryItem *item = getItem();
|
|
|
|
if( item && !mLandmark )
|
|
{
|
|
mLandmark = gLandmarkList.getAsset( item->getAssetUUID() );
|
|
if(mLandmark && mPlacePanel)
|
|
{
|
|
LLVector3 pos_region = mLandmark->getRegionPos(); // always have this
|
|
LLUUID landmark_asset_id = item->getAssetUUID(); // always have this
|
|
LLUUID region_id;
|
|
mLandmark->getRegionID(region_id); // might find null?
|
|
LLVector3d pos_global = getPositionGlobal(); // might be 0
|
|
mPlacePanel->displayParcelInfo(pos_region, landmark_asset_id, region_id, pos_global);
|
|
}
|
|
}
|
|
|
|
LLPreview::draw();
|
|
}
|
|
|
|
void LLPreviewLandmark::loadAsset()
|
|
{
|
|
const LLInventoryItem *item = getItem();
|
|
|
|
if( item && !mLandmark )
|
|
{
|
|
mLandmark = gLandmarkList.getAsset( item->getAssetUUID() );
|
|
}
|
|
mAssetStatus = PREVIEW_ASSET_LOADING;
|
|
}
|
|
|
|
LLPreview::EAssetStatus LLPreviewLandmark::getAssetStatus()
|
|
{
|
|
const LLInventoryItem *item = getItem();
|
|
if (item && gLandmarkList.assetExists(item->getAssetUUID()))
|
|
{
|
|
mAssetStatus = PREVIEW_ASSET_LOADED;
|
|
}
|
|
return mAssetStatus;
|
|
}
|
|
// static
|
|
void* LLPreviewLandmark::createPlaceDetail(void* userdata)
|
|
{
|
|
LLPreviewLandmark *self = (LLPreviewLandmark*)userdata;
|
|
self->mPlacePanel = new LLPanelPlace();
|
|
LLUICtrlFactory::getInstance()->buildPanel(self->mPlacePanel, "panel_place.xml");
|
|
const LLInventoryItem* item = self->getItem();
|
|
self->mPlacePanel->displayItemInfo(item);
|
|
|
|
return self->mPlacePanel;
|
|
}
|