Example #1
0
void modelShutdown()
{
	for (MODELMAP::iterator i = models.begin(); i != models.end(); i = models.erase(i))
	{
		iV_IMDRelease(i.value());
	}
	models.clear();
}
Example #2
0
const QString &modelName(iIMDShape *model)
{
	for (MODELMAP::iterator i = models.begin(); i != models.end(); ++i)
	{
		if (i.value() == model)
		{
			return i.key();
		}
	}
	ASSERT(false, "An IMD pointer could not be backtraced to a filename!");
	static QString error;
	return error;
}
Example #3
0
iIMDShape *modelGet(const QString &filename)
{
	QString name(filename.toLower());
	if (models.contains(name))
	{
		return models[name]; // cached
	}
	else if (tryLoad("structs/", name) || tryLoad("misc/", name) || tryLoad("effects/", name)
	         || tryLoad("components/prop/", name) || tryLoad("components/weapons/", name)
	         || tryLoad("components/bodies/", name) || tryLoad("features/", name)
	         || tryLoad("misc/micnum/", name) || tryLoad("misc/minum/", name) || tryLoad("misc/mivnum/", name) || tryLoad("misc/researchimds/", name))
	{
		return models[name];
	}
	debug(LOG_ERROR, "Could not find: %s", name.toUtf8().constData());
	return nullptr;
}
Example #4
0
static bool tryLoad(const QString &path, const QString &filename)
{
	if (PHYSFS_exists(path + filename))
	{
		char *pFileData = nullptr, *fileEnd;
		UDWORD size = 0;
		if (!loadFile(QString(path + filename).toUtf8().constData(), &pFileData, &size))
		{
			debug(LOG_ERROR, "Failed to load model file: %s", QString(path + filename).toUtf8().constData());
			return false;
		}
		fileEnd = pFileData + size;
		iIMDShape *s = iV_ProcessIMD(filename, (const char **)&pFileData, fileEnd);
		if (s)
		{
			models.insert(filename, s);
		}
		return true;
	}
	return false;
}
Example #5
0
ScriptDebugger::ScriptDebugger(const MODELMAP &models, QStandardItemModel *triggerModel) : QDialog(NULL, Qt::Window)
{
	modelMap = models;
	QSignalMapper *signalMapper = new QSignalMapper(this);

	// Add main page
	QWidget *mainWidget = new QWidget(this);
	QVBoxLayout *mainLayout = new QVBoxLayout();
	QHBoxLayout *placementLayout = new QHBoxLayout();
	placementLayout->addWidget(createButton("Add droids", SLOT(droidButtonClicked()), this));
	placementLayout->addWidget(createButton("Add structures", SLOT(structButtonClicked()), this));
	placementLayout->addWidget(createButton("Add features", SLOT(featButtonClicked()), this));
	mainLayout->addLayout(placementLayout);
	QHBoxLayout *miscLayout = new QHBoxLayout();
	miscLayout->addWidget(createButton("Research all", SLOT(researchButtonClicked()), this));
	miscLayout->addWidget(createButton("Show sensors", SLOT(sensorsButtonClicked()), this));
	miscLayout->addWidget(createButton("Shadows", SLOT(shadowButtonClicked()), this));
	miscLayout->addWidget(createButton("Fog", SLOT(fogButtonClicked()), this));
	mainLayout->addLayout(miscLayout);
	QHBoxLayout *worldLayout = new QHBoxLayout();
	worldLayout->addWidget(createButton("Show all", SLOT(deityButtonClicked()), this));
	worldLayout->addWidget(createButton("Weather", SLOT(weatherButtonClicked()), this));
	worldLayout->addWidget(createButton("Reveal mode", SLOT(revealButtonClicked()), this));
	mainLayout->addLayout(worldLayout);
	QHBoxLayout *selectedPlayerLayout = new QHBoxLayout();
	QLabel *selectPlayerLabel = new QLabel("Selected Player:");
	QComboBox *playerComboBox = new QComboBox;
	for (int i = 0; i < game.maxPlayers; i++)
	{
		playerComboBox->addItem(QString::number(i));
	}
	connect(playerComboBox, SIGNAL(activated(int)), this, SLOT(playerButtonClicked(int)));
	selectedPlayerLayout->addWidget(selectPlayerLabel);
	selectedPlayerLayout->addWidget(playerComboBox);
	mainLayout->addLayout(selectedPlayerLayout);
	QHBoxLayout *powerLayout = new QHBoxLayout();
	QLabel *powerLabel = new QLabel("Power:");
	QLineEdit *powerLineEdit = new QLineEdit;
	powerLineEdit->setText(QString::number(getPower(selectedPlayer)));
	connect(powerLineEdit, SIGNAL(textEdited(const QString&)), this, SLOT(powerEditing(const QString&)));
	connect(powerLineEdit, SIGNAL(returnPressed()), this, SLOT(powerEditingFinished()));
	powerLayout->addWidget(powerLabel);
	powerLayout->addWidget(powerLineEdit);
	mainLayout->addLayout(powerLayout);
	mainWidget->setLayout(mainLayout);
	tab.addTab(mainWidget, "Main");

	// Add globals
	for (MODELMAP::const_iterator i = models.constBegin(); i != models.constEnd(); ++i)
	{
		QWidget *dummyWidget = new QWidget(this);
		QScriptEngine *engine = i.key();
		QStandardItemModel *m = i.value();
		m->setParent(this); // take ownership to avoid memory leaks
		QTreeView *view = new QTreeView(this);
		view->setSelectionMode(QAbstractItemView::NoSelection);
		view->setModel(m);
		QString scriptName = engine->globalObject().property("scriptName").toString();
		int player = engine->globalObject().property("me").toInt32();
		QLineEdit *lineEdit = new QLineEdit(this);
		QVBoxLayout *layout = new QVBoxLayout();
		QHBoxLayout *layout2 = new QHBoxLayout();
		QPushButton *updateButton = new QPushButton("Update", this);
		QPushButton *button = new QPushButton("Run", this);
		connect(button, SIGNAL(pressed()), signalMapper, SLOT(map()));
		connect(updateButton, SIGNAL(pressed()), this, SLOT(updateModels()));
		signalMapper->setMapping(button, engine);
		editMap.insert(engine, lineEdit); // store this for slot
		layout->addWidget(view);
		layout2->addWidget(updateButton);
		layout2->addWidget(lineEdit);
		layout2->addWidget(button);
		layout->addLayout(layout2);

		dummyWidget->setLayout(layout);
		tab.addTab(dummyWidget, scriptName + ":" + QString::number(player));
	}
	connect(signalMapper, SIGNAL(mapped(QObject *)), this, SLOT(runClicked(QObject *)));

	// Add triggers
	triggerModel->setParent(this); // take ownership to avoid memory leaks
	triggerView.setModel(triggerModel);
	triggerView.resizeColumnToContents(0);
	triggerView.setSelectionMode(QAbstractItemView::NoSelection);
	triggerView.setSelectionBehavior(QAbstractItemView::SelectRows);
	tab.addTab(&triggerView, "Triggers");

	// Add labels
	labelModel = createLabelModel();
	labelModel->setParent(this); // take ownership to avoid memory leaks
	labelView.setModel(labelModel);
	labelView.resizeColumnToContents(0);
	labelView.setSelectionMode(QAbstractItemView::SingleSelection);
	labelView.setSelectionBehavior(QAbstractItemView::SelectRows);
	connect(&labelView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(labelClickedIdx(const QModelIndex &)));
	QPushButton *button = new QPushButton("Show", this);
	connect(button, SIGNAL(pressed()), this, SLOT(labelClicked()));
	QVBoxLayout *labelLayout = new QVBoxLayout(this);
	labelLayout->addWidget(&labelView);
	labelLayout->addWidget(button);
	QWidget *dummyWidget = new QWidget(this);
	dummyWidget->setLayout(labelLayout);
	tab.addTab(dummyWidget, "Labels");

	// Set up dialog
	QHBoxLayout *layout = new QHBoxLayout(this);
	layout->addWidget(&tab);
	setLayout(layout);
	resize(400, 500);
	setSizeGripEnabled(true);
	show();
	raise();
	powerLineEdit->setFocusPolicy(Qt::StrongFocus);
	powerLineEdit->setFocus();
	activateWindow();
}
//This message is triggered by the cscenevisibility manager.
//It hijacks the visibility list
DWORD CObjectCubeMapManager::OnCheckLODs(DWORD size, void *params)
{
	
	PERFORMANCE_PROFILER_START( CObjectCubeMapManager_OnCheckLODS )
		
	VERIFY_MESSAGE_SIZE(size, sizeof(ADDRENDERLISTPARAMS));

	// extract params
	ADDRENDERLISTPARAMS *arlp;
	arlp = (ADDRENDERLISTPARAMS *)params;
	static DWORD msgHash_AddRenderList = CHashString(_T("AddRenderList")).GetUniqueID();
	if( m_CubeMaps.size() == 0 )
	{
		m_ToolBox->SendMessage(msgHash_AddRenderList, sizeof(*arlp), arlp);
		PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
		return MSG_HANDLED_PROCEED;
	}

	OBJECTLIST::iterator objIter;
	OBJECTLIST *visibleObjList = NULL;
	OBJECTLIST spriteObjList;
	OBJECTLIST *spriteObjListPtr = NULL;
	IHashString *objName;
	DWORDSET::iterator setIter;
	CHashString modelFileName;
	CUBEMAPMAP::iterator cmIter;
	MODELMAP modelMap;
	MODELMAP::iterator mmIter;
	std::vector<OBJECTLIST::iterator> iteratorsToDelete;
	DWORD index;
	int numModels;
	ADDSPRITELISTMESSAGE aslm;
	Vec3 currentPosition;
	float pos[3];
	int i = 0;
	ChannelDesc channelDesc[2];
	LODSpriteVertex *data = NULL;
	IHashString *pCameraName = NULL;
	Vec3 camPos, vecCamView, vecCamUp, vecCamRight;
	EulerAngle objRotation;
	StdString error;
	Vec3 viewVec, st, uvw, right, up, camView;
	Vec3 upperRight, lowerRight, upperLeft, lowerLeft;
	Vec3 worldUp;
	Vec3 camRight, camUp;	
	CAMERAVECTORSPARAMS camVectors;
	// params for getting the bounding box
	GETBOUNDINGSPHEREPARAMS bSphere;
	Vec3 objPos;
	bSphere.position = &objPos;

	
	// grab the visible object list
	visibleObjList = arlp->objList;

	// go through object list and filter out objects that are sprites
	for (objIter = visibleObjList->begin(); objIter != visibleObjList->end(); ++objIter)
	{
		// get the name of the object
		objName = (*objIter)->GetName();

		// get model file name from the object
		static DWORD msgHash_GetModelFileName = CHashString(_T("GetModelFileName")).GetUniqueID();
		static CHashString hsCal3dType(_T("Cal3DRenderObject"));
		if (m_ToolBox->SendMessage(msgHash_GetModelFileName, sizeof(CHashString), &modelFileName, objName, &hsCal3dType) == MSG_HANDLED)
		{	// see if the name is in the map
			cmIter = m_CubeMaps.find(modelFileName.GetUniqueID());

			// if object is a sprite (in the map)
			if (cmIter != m_CubeMaps.end())
			{
				// see if this model type is in the map
				mmIter = modelMap.find(modelFileName.GetUniqueID());

				// if it is...
				if (mmIter != modelMap.end())
				{
					// grab the object list
					spriteObjListPtr = &mmIter->second;
					// add the sprite to the objectlist in the map
					spriteObjListPtr->push_back((*objIter));
				}
				else
				{
					// otherwise add sprite to new object list
					spriteObjList.push_back((*objIter));
					// add new object list to the map
					modelMap[modelFileName.GetUniqueID()] = spriteObjList;
					// clear the old object list
					spriteObjList.clear();
				}

				// add object iterator to the delete list
				iteratorsToDelete.push_back(objIter);
			}
		}
	}

	// go through delete list and DELETE!
	for (index = 0; index < iteratorsToDelete.size(); ++index)
	{
		// remove from regular visible list
		visibleObjList->erase(iteratorsToDelete[index]);
	}
	// clear the delete list since we are done with it
	iteratorsToDelete.clear();

	
	// get active camera name
	CHashString hszCameraName;
	CONTEXTCAMPARAMS ccp;
	ccp.pRC = NULL;
	ccp.szCameraName = &hszCameraName;
	static DWORD msgHash_GetActiveCamera = CHashString(_T("GetActiveCamera")).GetUniqueID();
	if (m_ToolBox->SendMessage(msgHash_GetActiveCamera, sizeof(CONTEXTCAMPARAMS), &ccp ) != MSG_HANDLED)
	{
		// log error
		error = _T("Camera not found.\n");
		m_ToolBox->SetErrorValue(WARN_OBJECT_NOT_FOUND);
		m_ToolBox->Log(LOGWARNING, error);
		PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
		return false; // no camera
	}
	pCameraName = ccp.szCameraName;

	// get the camera's position
	static DWORD msgHash_GetGlobalPosition = CHashString(_T("GetGlobalPosition")).GetUniqueID();
	if (m_ToolBox->SendMessage(msgHash_GetGlobalPosition, sizeof(Vec3), &camPos, pCameraName,
		&m_ccamTypeName) != MSG_HANDLED)
	{
		// log error
		error = _T("Could not retrieve origin of the active camera.\n");
		m_ToolBox->SetErrorValue(WARN_OBJECT_NOT_FOUND);
		m_ToolBox->Log(LOGWARNING, error);
		PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
		return false;
	}

	// get camera basis vectors
	camVectors.vViewVector = &vecCamView;
	camVectors.vUpVector = &vecCamUp;
	camVectors.vRightVector = &vecCamRight;
	static DWORD msgHash_GetCameraVectors = CHashString(_T("GetCameraVectors")).GetUniqueID();
	if (m_ToolBox->SendMessage(msgHash_GetCameraVectors, sizeof(camVectors), &camVectors, 
		pCameraName, &m_ccamTypeName ) != MSG_HANDLED)
	{
		// log error
		StdString error;
		error = _T("Error retrieving camera vectors.\n");
		m_ToolBox->SetErrorValue(WARN_OBJECT_NOT_FOUND);
		m_ToolBox->Log(LOGWARNING, error);
		PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
		return false;
	}

	camUp.Set(vecCamUp.x, vecCamUp.y, vecCamUp.z);
	camUp.Normalize();

	/*
	// get camera view vector
	viewVec.Set(vecCamView.x,vecCamView.y, vecCamView.z);

	// invert it
	viewVec.x = -viewVec.x;
	viewVec.y = -viewVec.y;
	viewVec.z = -viewVec.z;
	*/

	camView.Set(vecCamView.x,vecCamView.y, vecCamView.z);

	// invert it
	camView.x = -camView.x;
	camView.y = -camView.y;
	camView.z = -camView.z;


	/*
	// determine the major axis by finding the largest component of the camera look vector
	if (fabs(camView.x) > fabs(camView.y))
	{
		largest = camView.x;
		ma = CUBEMAP_FACE_X;
	}
	else
	{
		largest = camView.y;
		ma = CUBEMAP_FACE_Y;
	}
	
	if (fabs(largest) < fabs(camView.z))
	{
		largest = camView.z;
		ma = CUBEMAP_FACE_Z;
	}

	if (largest < 0)
	{
		ma++;
	}
	
	// compute the right vector  right = up x look
	right.x	= camUp.y*camView.z-camUp.z*camView.y;
	right.y	= camUp.z*camView.x-camUp.x*camView.z;
	right.z	= camUp.x*camView.y-camUp.y*camView.x;

	// normalize right vector
	right.Normalize();

	// compute the up vector up = look x right
	up.x = camView.y*right.z-camView.z*right.y;
	up.y = camView.z*right.x-camView.x*right.z;
	up.z = camView.x*right.y-camView.y*right.x;
	*/

	// go through the sprites
	for (mmIter = modelMap.begin(); mmIter != modelMap.end(); ++mmIter)
	{
		// grab sprite object list
		spriteObjListPtr = &mmIter->second;
		// find out how many models of this type we have
		numModels = spriteObjListPtr->size();
		// calculate the number of vertices needs
		aslm.m_numVertices = numModels * 6;
		// allocate vertices
		data = new LODSpriteVertex[aslm.m_numVertices];

		// reset i
		i = 0;

		// go through models in the list
		for(objIter = spriteObjListPtr->begin(); objIter != spriteObjListPtr->end(); ++objIter)
		{ 
			// get the name of the object
			objName = (*objIter)->GetParentName();

			// Get the current position of the object
			static DWORD msgHash_GetGlobalPosition = CHashString(_T("GetGlobalPosition")).GetUniqueID();
			m_ToolBox->SendMessage(msgHash_GetGlobalPosition, sizeof(Vec3), &currentPosition, objName );

			float distance = sqrt((currentPosition.x - camPos.x)*
				                  (currentPosition.x - camPos.x) +
								  (currentPosition.y - camPos.y)*
								  (currentPosition.y - camPos.y) +
								  (currentPosition.z - camPos.z)*
								  (currentPosition.z - camPos.z));

			if (distance < m_fFadeDistance)
			{
				continue;
			}

			static CHashString hsRenderObjectType(_T("Cal3DRenderObject"));

			// get the bounding box for the object
			static DWORD msgHash_GetBoundingSphere = CHashString(_T("GetBoundingSphere")).GetUniqueID();
			if (m_ToolBox->SendMessage(msgHash_GetBoundingSphere, sizeof(bSphere), &bSphere, objName, &hsRenderObjectType ) != MSG_HANDLED)
			{
				// log error
				error = _T("Cannot retrieve boundingsphere for ");
				error += objName->GetString();
				error += _T("\n");
				m_ToolBox->SetErrorValue(WARN_OBJECT_NOT_FOUND);
				m_ToolBox->Log(LOGWARNING, error);
				PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
				return MSG_ERROR;
			}

			// get the rotation for the object
			static DWORD msgHash_GetGlobalEuler = CHashString(_T("GetGlobalEuler")).GetUniqueID();
			if (m_ToolBox->SendMessage(msgHash_GetGlobalEuler, sizeof(EulerAngle), &objRotation, objName) != MSG_HANDLED)
			{
				PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
				return MSG_ERROR;
			}

			// get position values
			pos[0] = currentPosition.x;
			pos[1] = currentPosition.y;
			pos[2] = currentPosition.z;

			// compute vector from the camera to the center of the object
			// swapt z,y for Vision->Cube space
#if 1
			viewVec.x = camPos.x - pos[0];
			viewVec.y = camPos.y - pos[1];
			viewVec.z = camPos.z - pos[2];

			/// TESTING ONLY - NO ONE PANIC!
			Vec3 view(viewVec.x, viewVec.z, viewVec.y);
			Matrix3x3 rotMat;
			MathUtil math;
			math.EulerToMatrix(objRotation, rotMat);

			view *= rotMat;

			Vec3 newViewVec;
			newViewVec.x = view.x;
			newViewVec.y = view.z;
			newViewVec.z = view.y;
			newViewVec.Normalize();
			////////////////////////////////
#else
			//viewVec.x = pos[0] - camPos.x;
			//viewVec.z = pos[1] - camPos.y;
			//viewVec.y = pos[2] - camPos.z;

			GetCubeVector(CUBEMAP_FACE_NEGATIVE_Z, 64, 64, IMAGE_SIZE, IMAGE_SIZE, &viewVec);
#endif
			viewVec.Normalize();

			GetSTCoordinates(&newViewVec, &st);
			st.x *= IMAGE_SIZE;
			st.y *= IMAGE_SIZE;
			st.x -= .5f;
			st.y -= .5f;

			// clamp coordinates
			st.x = MIN((float)FLOOR(st.x+0.5f), IMAGE_SIZE);
			st.y = MIN((float)FLOOR(st.y+0.5f), IMAGE_SIZE);
			st.x = MAX(st.x, 0);
			st.x = MAX(st.x, 0);

			// construct 6 verts with different uvs, all with center position. 
			Vec3 center(pos[0], pos[1], pos[2]);

			switch ((DWORD)st.z) 
			{
				case CUBEMAP_FACE_Z:
					worldUp.Set(0.0f, 0, -1.0f);
					break;
				case CUBEMAP_FACE_NEGATIVE_Z:
					worldUp.Set(0.0f, 0, 1.0f);
					break;
				default:
					worldUp.Set(0.0f,-1.0f, 0);
					break;
			}

			// compute camera right vector using our world up vector and the camera look vector
			camRight.x	= worldUp.y*viewVec.y-worldUp.z*viewVec.z;
			camRight.y	= worldUp.z*viewVec.x-worldUp.x*viewVec.y;
			camRight.z	= worldUp.x*viewVec.z-worldUp.y*viewVec.x;

			// compute new camera up vector using the camera right vector and the camera look vector
			camUp.x	= camRight.y*viewVec.y-camRight.z*viewVec.z;
			camUp.y	= camRight.z*viewVec.x-camRight.x*viewVec.y;
			camUp.z	= camRight.x*viewVec.z-camRight.y*viewVec.x;

			// compute the right vector  right = up x look
			right.x	= camUp.y*viewVec.y-camUp.z*viewVec.z;
			right.y	= camUp.z*viewVec.x-camUp.x*viewVec.y;
			right.z	= camUp.x*viewVec.z-camUp.y*viewVec.x;

			// normalize right vector
			right.Normalize();

			// compute the up vector up = look x right
			up.x = viewVec.z*right.z-viewVec.y*right.y;
			up.y = viewVec.y*right.x-viewVec.x*right.z;
			up.z = viewVec.x*right.y-viewVec.z*right.x;
			
			// compute the size of the sprite (height of the object + a percentage of the height)
			float size = bSphere.radius * 4.0f; //+ (bbox.dimZ * 0.25f);

			// corners of the sprite
			upperRight = center + right*size + up*size;
			upperLeft = center - right*size + up*size;
			lowerRight = center + right*size - up*size;
			lowerLeft = center - right*size - up*size;

			// compute verticies
			data[i*6].pos[0] = lowerLeft.x; //pos[0]-5;
			data[i*6].pos[1] = lowerLeft.y; //pos[1];
			data[i*6].pos[2] = lowerLeft.z; //pos[2]-5;
			uvw.x = (float)((int)(st.x / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)((st.y + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6].u = uvw.x;
			data[i*6].v = uvw.y;
			data[i*6].w = uvw.z;
			
			data[i*6 + 1].pos[0] = lowerRight.x; //pos[0]+5;
			data[i*6 + 1].pos[1] = lowerRight.y; //pos[1];
			data[i*6 + 1].pos[2] = lowerRight.z; //pos[2]-5;
			uvw.x = (float)((int)((st.x + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)((st.y + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6 + 1].u = uvw.x;
			data[i*6 + 1].v = uvw.y;
			data[i*6 + 1].w = uvw.z;

			data[i*6 + 2].pos[0] =  upperLeft.x; //pos[0]-5;
			data[i*6 + 2].pos[1] =  upperLeft.y; //pos[1];
			data[i*6 + 2].pos[2] =  upperLeft.z; //pos[2]+5;
			uvw.x = (float)((int)(st.x / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)(st.y / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6 + 2].u = uvw.x;
			data[i*6 + 2].v = uvw.y;
			data[i*6 + 2].w = uvw.z;
			
			data[i*6 + 3].pos[0] =  upperLeft.x; //pos[0]-5;
			data[i*6 + 3].pos[1] =  upperLeft.y; //pos[1];
			data[i*6 + 3].pos[2] =  upperLeft.z; //pos[2]+5;
			uvw.x = (float)((int)(st.x / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)(st.y / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6 + 3].u = uvw.x;
			data[i*6 + 3].v = uvw.y;
			data[i*6 + 3].w = uvw.z;
			
			data[i*6 + 4].pos[0] =  lowerRight.x; //pos[0]+5;
			data[i*6 + 4].pos[1] =  lowerRight.y; //pos[1];
			data[i*6 + 4].pos[2] =  lowerRight.z; //pos[2]-5;
			uvw.x = (float)((int)((st.x + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)((st.y + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6 + 4].u = uvw.x;
			data[i*6 + 4].v = uvw.y;
			data[i*6 + 4].w = uvw.z;
			
			data[i*6 + 5].pos[0] =  upperRight.x; //pos[0]+5;
			data[i*6 + 5].pos[1] =  upperRight.y; //pos[1];
			data[i*6 + 5].pos[2] =  upperRight.z; //pos[2]+5;
			uvw.x = (float)((int)((st.x + TILE_SIZE) / TILE_SIZE) * TILE_SIZE);
			uvw.y = (float)((int)(st.y / TILE_SIZE) * TILE_SIZE);
			GetCubeVector( (DWORD)st.z, uvw.x, uvw.y, IMAGE_SIZE, IMAGE_SIZE, &uvw );
			data[i*6 + 5].u = uvw.x;
			data[i*6 + 5].v = uvw.y;
			data[i*6 + 5].w = uvw.z;
			
			// increment i
			++i;
		}

		// setup descriptor
		channelDesc[0] = MESH_STREAM_VERTEX_POSITION3;
		channelDesc[1] = MESH_STREAM_VERTEX_CUBECOORD1;

		// find the model name in the map of cubemaps
		cmIter = m_CubeMaps.find(mmIter->first);

		if (cmIter == m_CubeMaps.end())
		{
			// something's wrong here
			//TODO: Free up the memory initialized!
			PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );
			return MSG_ERROR;
		}

		// setup message params
		aslm.m_Data = data;
		aslm.m_ChannelDescriptor = channelDesc;
		aslm.m_NumChannels = 2;
		aslm.m_Texture = cmIter->second;
		aslm.m_Effect = m_CubeMapShader;
		
		// make sure our texture and shader are valid
		if (cmIter->second 
			&& m_CubeMapShader)
		{
			// Send data to sprite manager
			static DWORD msgHash_AddSprite = CHashString(_T("AddSprite")).GetUniqueID();
			m_ToolBox->SendMessage(msgHash_AddSprite, sizeof(aslm), &aslm);
		}

		// delete data
		if (data)
		{
			delete [] data;
			data = NULL;
		}
	}

	PERFORMANCE_PROFILER_STOP( CObjectCubeMapManager_OnCheckLODS );

	return MSG_HANDLED_PROCEED;
}
ScriptDebugger::ScriptDebugger(const MODELMAP &models, QStandardItemModel *triggerModel) : QDialog(NULL, Qt::Window)
{
	modelMap = models;
	QSignalMapper *signalMapper = new QSignalMapper(this);

	// Add globals
	for (MODELMAP::const_iterator i = models.constBegin(); i != models.constEnd(); ++i)
	{
		QWidget *dummyWidget = new QWidget(this);
		QScriptEngine *engine = i.key();
		QStandardItemModel *m = i.value();
		m->setParent(this); // take ownership to avoid memory leaks
		QTreeView *view = new QTreeView(this);
		view->setSelectionMode(QAbstractItemView::NoSelection);
		view->setModel(m);
		QString scriptName = engine->globalObject().property("scriptName").toString();
		int player = engine->globalObject().property("me").toInt32();
		QLineEdit *lineEdit = new QLineEdit(this);
		QVBoxLayout *layout = new QVBoxLayout();
		QHBoxLayout *layout2 = new QHBoxLayout();
		QPushButton *updateButton = new QPushButton("Update", this);
		QPushButton *button = new QPushButton("Run", this);
		connect(button, SIGNAL(pressed()), signalMapper, SLOT(map()));
		connect(updateButton, SIGNAL(pressed()), this, SLOT(updateModels()));
		signalMapper->setMapping(button, engine);
		editMap.insert(engine, lineEdit); // store this for slot
		layout->addWidget(view);
		layout2->addWidget(updateButton);
		layout2->addWidget(lineEdit);
		layout2->addWidget(button);
		layout->addLayout(layout2);

		dummyWidget->setLayout(layout);
		tab.addTab(dummyWidget, scriptName + ":" + QString::number(player));
	}
	connect(signalMapper, SIGNAL(mapped(QObject *)), this, SLOT(runClicked(QObject *)));

	// Add triggers
	triggerModel->setParent(this); // take ownership to avoid memory leaks
	triggerView.setModel(triggerModel);
	triggerView.resizeColumnToContents(0);
	triggerView.setSelectionMode(QAbstractItemView::NoSelection);
	triggerView.setSelectionBehavior(QAbstractItemView::SelectRows);
	tab.addTab(&triggerView, "Triggers");

	// Add labels
	labelModel = createLabelModel();
	labelModel->setParent(this); // take ownership to avoid memory leaks
	labelView.setModel(labelModel);
	labelView.resizeColumnToContents(0);
	labelView.setSelectionMode(QAbstractItemView::SingleSelection);
	labelView.setSelectionBehavior(QAbstractItemView::SelectRows);
	connect(&labelView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(labelClickedIdx(const QModelIndex &)));
	QPushButton *button = new QPushButton("Show", this);
	connect(button, SIGNAL(pressed()), this, SLOT(labelClicked()));
	QVBoxLayout *labelLayout = new QVBoxLayout(this);
	labelLayout->addWidget(&labelView);
	labelLayout->addWidget(button);
	QWidget *dummyWidget = new QWidget(this);
	dummyWidget->setLayout(labelLayout);
	tab.addTab(dummyWidget, "Labels");

	// Set up dialog
	QHBoxLayout *layout = new QHBoxLayout(this);
	layout->addWidget(&tab);
	setLayout(layout);
	setSizeGripEnabled(true);
	show();
	raise();
	activateWindow();
}