⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 note.cpp

📁 机甲指挥官2源代码
💻 CPP
字号:
//===========================================================================//
// File:     notation.cpp                                                    //
// Title:    Definition of NotationFile classes.                             //
// Purpose:  Provide general purpose access to data stored in a formatted    //
//           text file.                                                      //
//---------------------------------------------------------------------------//
// Copyright (C) Microsoft Corporation. All rights reserved.                 //
//===========================================================================//

#include "StuffHeaders.hpp"

#define MAX_LINE_SIZE 512

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::WriteNotation(MemoryStream *stream)
{
	Check_Object(this);
	Check_Object(stream);

	if (m_name)
		*stream << (const char*)m_name;
	if (m_text)
		*stream << '=' << (const char*)m_text;
	*stream << "\r\n";
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(int *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	*value = atoi(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(int value)
{
	Check_Object(this);

	char contents[12];
	_itoa(value, contents, 10);
	Verify(strlen(contents) < sizeof(contents));

	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(Scalar *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	*value = AtoF(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(Scalar value)
{
	Check_Object(this);

	char contents[32];
	sprintf(contents, "%f", value);
	Verify(strlen(contents) < sizeof(contents));

	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(bool *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	*value = (!_stricmp(contents, "true") || !_stricmp(contents, "yes") || atoi(contents) != 0);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(bool value)
{
	Check_Object(this);

	SetEntry((value)?"true":"false");
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(Vector3D *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	int count =
		sscanf(
			contents,
			"%f %f %f",
			&value->x,
			&value->y,
			&value->z
		);
	if (count != 3)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not a Vector!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const Vector3D &value)
{
	Check_Object(this);

	static char contents[64];
	int temp;
	temp = sprintf(
		contents,
		"%f %f %f",
		value.x,
		value.y,
		value.z
	);
	Verify (temp <sizeof(contents));
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(YawPitchRoll *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	int count =
		sscanf(
			contents,
			"%f %f %f",
			&value->yaw,
			&value->pitch,
			&value->roll
		);
	if (count != 3)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not a YawPitchRoll!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
	value->yaw *= Radians_Per_Degree;
	value->pitch *= Radians_Per_Degree;
	value->roll *= Radians_Per_Degree;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const YawPitchRoll &value)
{
	Check_Object(this);

	static char
		contents[32];
	sprintf(
		contents,
		"%f %f %f",
		value.yaw * Degrees_Per_Radian,
		value.pitch * Degrees_Per_Radian,
		value.roll * Degrees_Per_Radian
	);
	Verify(strlen(contents) < sizeof(contents));
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(UnitQuaternion *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	YawPitchRoll ypr;
	int count =
		sscanf(
			contents,
			"%f %f %f",
			&ypr.yaw,
			&ypr.pitch,
			&ypr.roll
		);
	if (count != 3)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not a UnitQuaternion!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
	ypr.yaw *= Radians_Per_Degree;
	ypr.pitch *= Radians_Per_Degree;
	ypr.roll *= Radians_Per_Degree;
	*value = ypr;
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const UnitQuaternion &value)
{
	Check_Object(this);

	static char
		contents[32];
	YawPitchRoll ypr(value);
	Verify(strlen(contents) < sizeof(contents));
	sprintf(
		contents,
		"%f %f %f",
		ypr.yaw * Degrees_Per_Radian,
		ypr.pitch * Degrees_Per_Radian,
		ypr.roll * Degrees_Per_Radian
	);
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(Motion3D *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	int count =
		sscanf(
			contents,
			"%f %f %f %f %f %f",
			&value->linearMotion.x,
			&value->linearMotion.y,
			&value->linearMotion.z,
			&value->angularMotion.x,
			&value->angularMotion.y,
			&value->angularMotion.z
		);
	if (count != 6)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not a Motion!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const Motion3D &value)
{
	Check_Object(this);

	static char
		contents[64];
	sprintf(
		contents,
		"%f %f %f %f %f %f",
		value.linearMotion.x,
		value.linearMotion.y,
		value.linearMotion.z,
		value.angularMotion.x,
		value.angularMotion.y,
		value.angularMotion.z
	);
	Verify(strlen(contents) < sizeof(contents));
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(RGBColor *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	int count =
		sscanf(
			contents,
			"%f %f %f",
			&value->red,
			&value->green,
			&value->blue
		);
	if (count != 3)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not an RGBColor!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const RGBColor &value)
{
	Check_Object(this);

	static char
		contents[32];
	sprintf(
		contents,
		"%f %f %f",
		value.red,
		value.green,
		value.blue
	);
	Verify(strlen(contents) < sizeof(contents));
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(RGBAColor *value)
{
	Check_Object(this);
	Check_Pointer(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);
	int count =
		sscanf(
			contents,
			"%f %f %f %f",
			&value->red,
			&value->green,
			&value->blue,
			&value->alpha
		);
	if (count == 3)
		value->alpha = 1.0f;
	if (count < 3)
	{
		Page *page = m_page;
		Check_Object(page);
		NotationFile *file = page->m_notationFile;
		Check_Object(file);
		STOP((
			"%s: {[%s]%s=%s} is not an RGBAColor!",
			file->GetFileName(),
			page->m_name,
			m_name,
			contents
		));
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(const RGBAColor &value)
{
	Check_Object(this);

	static char
		contents[48];
	sprintf(
		contents,
		"%f %f %f %f",
		value.red,
		value.green,
		value.blue,
		value.alpha
	);
	Verify(strlen(contents) < sizeof(contents));
	SetEntry(contents);
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::GetEntry(NotationFile *value)
{
	Check_Object(this);
	Check_Object(value);

	const char *contents = NULL;
	GetEntry(&contents);
	Check_Pointer(contents);

	//
	//-------------------------------------------------------
	// If this is a file reference, open the file and read it
	//-------------------------------------------------------
	//
	if (strncmp(contents, "{\r\n", 3))
	{
		FileStream file(contents);
		value->m_fileName = file.GetFileName();
		value->m_fileDependencies.AddDependency(&file);
		value->Read(&file, NULL, NULL, false);
	}

	//
	//--------------------------------------------------------------------
	// Otherwise, we are reading a nested file, so set up the dependencies
	//--------------------------------------------------------------------
	//
	else
	{
		MemoryStream stream(const_cast<char*>(contents+3), strlen(contents)-3);
		NotationFile *parent_file = m_page->GetNotationFile();
		Check_Object(parent_file);
		value->m_fileDependencies.AddDependencies(
			parent_file->GetFileDependencies()
		);

		//
		//-----------------------------------
		// Figure out the name of the subfile
		//-----------------------------------
		//
		if (parent_file->GetFileName())
		{
			MString name(parent_file->GetFileName());
			name += '[';
			name += GetName();
			name += ']';
			value->m_fileName = name;
		}

		//
		//--------------------
		// Read the string now
		//--------------------
		//
		value->Read(&stream, NULL, NULL, true);
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::SetEntry(NotationFile *value)
{
	Check_Object(this);
	Check_Object(value);

	//
	//----------------------------------------------------
	// If this isn't a nested file, write out the filename
	//----------------------------------------------------
	//
	const char* name = value->GetFileName();
	if (name && name[strlen(name)-1] != ']')
		SetEntry(name);

	//
	//-------------------------------------------------------------------------
	// Otherwise, we need to write the notation file out to a memory stream and
	// assign that to the entry
	//-------------------------------------------------------------------------
	//
	else
	{
		DynamicMemoryStream file_buffer(5);
		file_buffer << "{\r\n";
		value->Write(&file_buffer);
		file_buffer << "}" << '\0';
		file_buffer.Rewind();
		SetEntry(static_cast<const char*>(file_buffer.GetPointer()));
		value->IgnoreChanges();
	}
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
//
void
	Note::TestInstance() const
{
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -