OSDN Git Service

自プレイヤーモデルの非同期読み込みに対応
authorh2so5 <h2so5@git.sourceforge.jp>
Fri, 7 Sep 2012 16:04:27 +0000 (01:04 +0900)
committerh2so5 <h2so5@git.sourceforge.jp>
Fri, 7 Sep 2012 16:04:27 +0000 (01:04 +0900)
client/3d/FieldPlayer.cpp
client/3d/FieldPlayer.hpp
client/Card.cpp
client/Core.cpp
client/PlayerManager.cpp
client/ResourceManager.cpp
client/ResourceManager.hpp
client/bin/cards/modellist/main.js [new file with mode: 0644]

index c1f2c11..ef7edba 100644 (file)
@@ -60,7 +60,7 @@ void FieldPlayer::Draw() const
 
 void FieldPlayer::Init(tstring model_name)
 {
-    SetModel(model_name);
+    LoadModel(model_name);
     ResetPosition();
 }
 
@@ -96,9 +96,18 @@ void FieldPlayer::RescuePosition()
        current_stat_.vel.y = 0;
 }
 
-void FieldPlayer::SetModel(const tstring& name)
+void FieldPlayer::LoadModel(const tstring& name)
 {
-    model_handle_ = ResourceManager::LoadModelFromName(name);
+    if (model_handle_) {
+               loading_model_handle_ = ResourceManager::LoadModelFromName(name, true);
+       } else {
+               SetModel(ResourceManager::LoadModelFromName(name));
+       }
+}
+
+void FieldPlayer::SetModel(const ModelHandle& model)
+{
+    model_handle_ = model;
     model_height_ = model_handle_.property().get<float>("character.height", 1.58f);
        flight_duration_ideal_ = sqrt((model_height_*2.0f)/9.8f) + sqrt((model_height_*0.8f)/9.8);
        jump_height_ = sqrt(15.0f)*2.0f;
@@ -112,6 +121,10 @@ void FieldPlayer::SetModel(const tstring& name)
 
 void FieldPlayer::Update()
 {
+       if (loading_model_handle_ && loading_model_handle_.CheckLoaded()) {
+               SetModel(loading_model_handle_);
+               loading_model_handle_ = ModelHandle();
+       }
     /*
     if (key_checker_.Check() == -1)
     {
index 5974315..34a70ec 100644 (file)
Binary files a/client/3d/FieldPlayer.hpp and b/client/3d/FieldPlayer.hpp differ
index 695b6d6..8990d65 100644 (file)
Binary files a/client/Card.cpp and b/client/Card.cpp differ
index 68c668f..49a483d 100644 (file)
@@ -103,6 +103,9 @@ int Core::SetUpDxLib()
     SetDragFileValidFlag(TRUE);
     DragFileInfoClear();
 
+    MV1SetLoadModelPhysicsWorldGravity(-100);
+    MV1SetLoadModelUsePhysicsMode(DX_LOADMODEL_PHYSICS_LOADCALC);
+
     return 0;
 }
 
index 0a0751c..a7094cf 100644 (file)
Binary files a/client/PlayerManager.cpp and b/client/PlayerManager.cpp differ
index c8b4d24..0f9d3ac 100644 (file)
Binary files a/client/ResourceManager.cpp and b/client/ResourceManager.cpp differ
index 4a5e216..dca3c2d 100644 (file)
@@ -23,6 +23,15 @@ class ModelHandle;
 typedef std::shared_ptr<ImageHandle> ImageHandlePtr;
 typedef std::shared_ptr<ModelHandle> ModelHandlePtr;
 
+struct ReadFuncData {
+       ReadFuncData(){};
+       ReadFuncData(const ptree& info);
+    boost::filesystem::wpath model_dir;
+    std::list<std::pair<std::string, std::string>> motions;
+    std::list<std::pair<std::string, std::string>>::iterator motions_it;
+};
+typedef std::shared_ptr<ReadFuncData> ReadFuncDataPtr;
+
 class ResourceManager {
 
     public:
@@ -66,9 +75,14 @@ class ResourceManager {
         // models
         static void BuildModelFileTree();
         static void CacheBakedModel();
-        static ModelHandle LoadModelFromName(const tstring&);
+        static ModelHandle LoadModelFromName(const tstring&, bool async = false);
+        static void RequestModelFromName(const tstring&);
+        static bool IsCachedModelName(const tstring&);
                static const std::vector<std::string>& GetModelNameList();
 
+       private:
+               static tstring NameToFullPath(const tstring& name);
+
     private:
         static int default_font_handle_;
         static std::unordered_map<tstring, ImageHandlePtr> graph_handles_;
@@ -95,7 +109,7 @@ class ModelHandle {
     friend class ResourceManager;
 
     private:
-        ModelHandle(int handle, const std::shared_ptr<ptree>& property, bool async_load = false);
+        ModelHandle(int handle, const ReadFuncDataPtr& funcdata, const std::shared_ptr<ptree>& property, bool async_load = false);
         ModelHandle Clone();
 
     public:
@@ -105,9 +119,14 @@ class ModelHandle {
         int handle() const;
         const ptree& property() const;
         std::string name() const;
+               
+        operator bool() const;
+
+               bool CheckLoaded();
 
     private:
         int handle_;
+               ReadFuncDataPtr funcdata_;
         std::shared_ptr<ptree> property_;
         std::string name_;
         bool async_load_;
diff --git a/client/bin/cards/modellist/main.js b/client/bin/cards/modellist/main.js
new file mode 100644 (file)
index 0000000..24c156b
--- /dev/null
@@ -0,0 +1,39 @@
+
+/***MetaData***
+
+{
+       "name": "\83\82\83f\83\8b\83\8a\83X\83g",
+       "icon": "icon.png",
+       "api_version": 1
+}
+
+***MetaData***/
+
+var list;
+list = new UI.List({
+       docking: UI.DOCKING_TOP | UI.DOCKING_LEFT | UI.DOCKING_RIGHT | UI.DOCKING_BOTTOM
+});
+
+var even_line = false;
+var model_names = Model.all();
+for (var i = 0; i < model_names.length; i++) {
+       if ((/char:/).test(model_names[i])) {
+               (function(model_name){
+                       list.addItem(
+                               new UI.Label({
+                                       docking: UI.DOCKING_TOP | UI.DOCKING_LEFT | UI.DOCKING_RIGHT,
+                                       text: model_name,
+                                       bgcolor: ((even_line = !even_line) ? "#EEAFEECC" : "#FFFFFFCC"),
+                                       onclick: function() {
+                                               Account.updateModelName(model_name)
+                                       }
+                               })
+                       );
+               })(model_names[i])
+       }
+}
+
+Card.board.width = 240;
+Card.board.height = 120;
+Card.board.docking = UI.DOCKING_TOP | UI.DOCKING_RIGHT
+Card.board.addChild(list);
\ No newline at end of file