태그 : Nebula3
2009/03/28 Anatomy of Nebula3 - Loading Custom Model
2009/03/24 Anatomy of Nebula3 - Terms
2009/02/05 Nebula3 Application Layer
2009/02/05 Nebula3 Graphics subsystem [1]
2009/02/05 Nebula3 Resource subsystem
# by | 2009/04/24 18:02 | Nebula3 | 트랙백 | 덧글(0)
StreamReader는 ResourceLoader 클래스의 서브 클래스이며 리소스 파일을 스트리밍을 통해서 읽어 들이는 처리를 한다. 읽어 들일때에는 비동기적인 방법으로 읽어 들인다. 아래 소스에서 보듯이StreamModelLoader::SetupModelFromStream 함수에서 리소스 파일의 확장자에 따라 적절한ModelReader를 생성하고 생성한 ModelReader에서는 리소스 파일을 파싱해서 실제로 읽어 들이는 처리를 한다.
bool StreamModelLoader::SetupModelFromStream(const Ptr<Stream>& stream) { n_assert(stream.isvalid()); n_assert(stream->CanBeMapped()); // first decide what ModelReader to use bool isLegacyFile = false; String fileExt = this->resource->GetResourceId().Value().GetFileExtension(); Ptr<ModelReader> modelReader; if (fileExt == "n3") { // Nebula3 binary format modelReader = (ModelReader*) BinaryModelReader::Create(); } else if (fileExt == "xml") { // Nebula3 XML format modelReader = (ModelReader*) XmlModelReader::Create(); } else if (fileExt == "n2") { // legacy Nebula2 binary format modelReader = (ModelReader*) N2ModelReader::Create(); modelReader->SetModelResId(this->resource->GetResourceId()); isLegacyFile = true; } else { n_error("StreamModelLoader: unrecognized file extension '%s' in '%s'!", fileExt.AsCharPtr(), this->resource->GetResourceId().Value().AsCharPtr()); return false; } |
bool D3D9StreamMeshLoader::SetupResourceFromStream(const Ptr<Stream>& stream) { n_assert(stream.isvalid()); n_assert(this->resource.isvalid()); #if NEBULA3_LEGACY_SUPPORT if (this->resource->GetResourceId().Value().GetFileExtension() == "nvx2") { return this->SetupMeshFromNvx2(stream); } else #endif if (this->resource->GetResourceId().Value().GetFileExtension() == "nvx3") { return this->SetupMeshFromNvx3(stream); } else if (this->resource->GetResourceId().Value().GetFileExtension() == "n3d3") { return this->SetupMeshFromN3d3(stream); } else { n_error("D3D9StreamMeshLoader::SetupMeshFromStream(): unrecognized fileextension in '%s'\n",this->resource->GetResourceId().Value().AsCharPtr()); return false; } } |
SetupMeshFromNvx2에서는 Legacy::Nvx2StreamReader를 통해서 .nvx2 파일을 읽어 들이고 이것을 정점 버퍼와 인덱스 버퍼에 연결한다.
bool D3D9StreamMeshLoader::SetupMeshFromNvx2(const Ptr<Stream>& stream) { n_assert(stream.isvalid()); Ptr<Legacy::Nvx2StreamReader> nvx2Reader = Legacy::Nvx2StreamReader::Create(); nvx2Reader->SetStream(stream); if (nvx2Reader->Open()) { const Ptr<Mesh>& res = this->resource.downcast<Mesh>(); n_assert(!res->IsLoaded()); res->SetVertexBuffer(nvx2Reader->GetVertexBuffer().downcast<CoreGraphics::VertexBuffer>()); res->SetIndexBuffer(nvx2Reader->GetIndexBuffer().downcast<CoreGraphics::IndexBuffer>()); res->SetPrimitiveGroups(nvx2Reader->GetPrimitiveGroups()); nvx2Reader->Close(); return true; } return false; } |
# by | 2009/03/28 09:37 | Nebula3 | 트랙백 | 덧글(0)
Anatomy of Nebula3 - Terms
Nebula3는 Nebula2에 비해서 훨씬 더 많은 클래스들로 구성이 되어 있다. (하지만 실제 코드의 라인수는 훨씬 적다.) 또 새로운 클래스들이 많기 때문에 다소 생소한 부분도 많다. 이들 클래스들 간의 관계를 잘 살펴서 이해하면 전체적인 구조를 쉽게 파악할 수있다. 이 글에서는 이들 클래스들 중에서 비슷한 이름으로 헷갈리기 쉽거나 파악이 모호한 것들의 관계에 대해서 설명한다.
namespace Models { class Model : public Resources::Resource { ... }; } |
Ptr<ModelInstance> modelInstance = model->CreateInstance(); |
namespace Model { class ModelNodeInstance : : public Core::RefCounted { ... // 매 프레임마다 호출된다. virtual void Update(); ... }; } |
# by | 2009/03/24 16:24 | Nebula3 | 트랙백 | 덧글(0)
# by | 2009/02/05 10:57 | Nebula Device | 트랙백 | 핑백(1) | 덧글(0)
# by | 2009/02/05 10:56 | Nebula Device | 트랙백 | 핑백(1) | 덧글(1)
# by | 2009/02/05 10:54 | Nebula Device | 트랙백 | 핑백(1) | 덧글(0)
◀ 이전 페이지다음 페이지 ▶