当前位置: 首页>>代码示例>>C++>>正文


C++ Document::Load方法代码示例

本文整理汇总了C++中Document::Load方法的典型用法代码示例。如果您正苦于以下问题:C++ Document::Load方法的具体用法?C++ Document::Load怎么用?C++ Document::Load使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Document的用法示例。


在下文中一共展示了Document::Load方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: Load

		bool SkeletonAnimation::Load(Rid rid)
		{
			if(data.data != nullptr) {
				data.Delete();
			}
			frameCount = 0;
			frameRate = 0.0f;

			Document doc;
			if(!doc.Load(rid)) {
				Console::Error("Could not parse file as document <rid %d>", rid);
				return false;
			}

			uint32 count;
			if(!doc.root->ResolveAsUInt("bone_count.#0", &count)) {
				Console::Error("Could not find bone count in animation document");
				return false;
			}
			data.SetSize(count);
			data.Zero();

			if(!doc.root->ResolveAsFloat("frame_rate.#0", &frameRate)) {
				Console::Error("Could not find frame rate in animation document");
				return false;
			}
			if(!doc.root->ResolveAsUInt("frame_count.#0", &frameCount)) {
				Console::Error("Could not find frame count in animation document");
				return false;
			}
		
			for(uint32 i = 3; i < doc.root->count; i++) {
				Document::Node *boneNode = doc.root->children[i];
				uint32 bone = i-3;

				data[bone].SetSize(boneNode->count);
				data[bone].Zero();

				for(uint32 j = 0; j < boneNode->count; j++) {
					Document::Node *n = boneNode->children[j];
					KeyFrame &kf = data[bone][j];

					kf.frame = n->ValueAsUInt();
					kf.offset = Vector3(n->children[0]->ValueAsFloat(), n->children[1]->ValueAsFloat(), n->children[2]->ValueAsFloat());

					Vector3 eulerAngles = Vector3(n->children[3]->ValueAsFloat(), n->children[4]->ValueAsFloat(), n->children[5]->ValueAsFloat()) * MAKI_DEG_TO_RAD;
					kf.rot.FromEulerAngles(eulerAngles);
				}
			}

			this->rid = rid;
			return true;
		}
开发者ID:ericroy,项目名称:maki-engine,代码行数:53,代码来源:MakiSkeletonAnimation.cpp

示例2: Load

		bool Material::Load(Rid rid)
		{
			CoreManagers *res = CoreManagers::Get();
			Engine *eng = Engine::Get();

			if(rid == RID_NONE) {
				Console::Error("Failed to load material, rid is RID_NONE");
				return false;
			}

			Document doc;
			if(!doc.Load(rid)) {
				Console::Error("Failed to parse material file <rid %d>", rid);
				return false;
			}

			ShaderProgram *shader = nullptr;
			Rid shaderProgramRid = RID_NONE;
			Document::Node *n = nullptr;

			char *shaderProgramPath = doc.root->ResolveValue("shader.#0");
			if(shaderProgramPath == nullptr) {
				Console::Error("Material did not specify a shader");
				goto failed;
			}
			shaderProgramRid = Engine::Get()->assets->PathToRid(shaderProgramPath);
			if(shaderProgramRid == RID_NONE) {
				Console::Error("Could not resolve rid from shader program path: %s", shaderProgramPath);
				goto failed;
			}

		
			shaderProgram = res->shaderProgramManager->Load(shaderProgramRid);
			if(shaderProgram == HANDLE_NONE) {
				goto failed;
			}
			shader = ShaderProgramManager::Get(shaderProgram);

		
			n = doc.root->Resolve("texture_set");
			if(n != nullptr) {
				Rid textureSetRids[TextureSet::MAX_TEXTURES_PER_SET];
				uint32 textureSetSize = n->count;
				assert(textureSetSize < TextureSet::MAX_TEXTURES_PER_SET);
				for(uint32 i = 0; i < n->count; i++) {
					Rid texRid = eng->assets->PathToRid(n->children[i]->value);
					if(texRid == RID_NONE) {
						Console::Error("Could not resolve rid from texture path: %s", n->children[i]->value);
						goto failed;
					}
					textureSetRids[i] = texRid;
				}
				textureSet = res->textureSetManager->Load(textureSetSize, textureSetRids);
				if(textureSet == HANDLE_NONE) {
					Console::Error("Failed to construct texture set from rid list");
					goto failed;
				}
			}


			n = doc.root->Resolve("uniforms");
			if(n != nullptr) {
				for(uint32 i = 0; i < n->count; i++) {
					Document::Node *uniform = n->children[i];
					if(uniform->count != 1) {
						Console::Error("Uniform node must have a single child specifying data type");
						goto failed;
					}
					Document::Node *dataType = uniform->children[0];
					if(dataType->count == 0) {
						Console::Error("Uniform data type node must have at least one child");
						goto failed;
					}

					uint32 valueCount = dataType->count;
					char *buffer = (char *)Allocator::Malloc(valueCount*4);
					for(uint32 i = 0; i < valueCount; i++) {
						if(dataType->value[0] == 'f') {
							((float *)buffer)[i] = dataType->children[i]->ValueAsFloat();
						} else if(dataType->value[0] == 'u') {
							((uint32 *)buffer)[i] = (uint32)dataType->children[i]->ValueAsInt();
						} else if(dataType->value[0] == 'i') {
							((int32 *)buffer)[i] = (int32)dataType->children[i]->ValueAsInt();
						} else {
							SAFE_DELETE_ARRAY(buffer);
							Console::Error("Unrecognized uniform data type: %s", dataType->value);
							goto failed;
						}
					}
					if(PushConstant(uniform->value, valueCount*4, buffer) == -1) {
						Console::Warning("Warning, material has unbound uniforms <rid %d>", rid);
					}
				}
			}

			this->rid = rid;
			return true;

		failed:
			TextureSetManager::Free(textureSet);
//.........这里部分代码省略.........
开发者ID:ericroy,项目名称:maki-engine,代码行数:101,代码来源:MakiMaterial.cpp


注:本文中的Document::Load方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。