2014年9月23日 星期二

QNX專案設定

待補充....

剛建好專案,發覺無法Run。
原因是在Documentation中有一段講Communication with the QNX Neutrino RTOS

似乎在PC上debug也一定要有個平台才行

所以我用VMware跑一個評估版的QNX,ip在192.168.6.128

上面說裡面一定要跑一個qconn 的program, 評估版的本來就有

然後在專案裡,Perspective > QNX System Information
在Target Navigator view裡建一個New QNX Target
輸入剛才的ip,然後Finish

這樣IDE中的執行檔就可以Run

此外,如果發覺編完找不到Library,記得在Project Preference裡,加入Extra的library

(libscreen只要打screen就好,前面的lib不用打。)





2014年9月16日 星期二

從vmware的QNX連到 win7的shared folder

試了很久,google了半天,找不到為何連不過去

後來發現原因,原來是電腦名稱和別人衝到.....把名稱改了後就可以....囧 

在vm 裝評估版的QNX 在Windows開一個Shared folder

例如我的分享資料夾叫 Share, QNX的叫 mnt 然後打

 fs-cifs -l -vvvvvv //電腦名稱:電腦ip:/Share /mnt 

-l 是要輸入user name和password
-v 是debug訊息的多寡

 電腦名稱大小寫沒差
 username大小寫也沒差

2014年9月15日 星期一

Create Image form memory

最近在測試從網路上抓 Google map下來,但不知該怎把抓下來的圖轉成Kanzi可用的。

這個軟體目前資源很少呀,用的人不多,不像Unity3D,可以很簡單就做到。

跟網路的溝通我是用POCO這個library



 std::string url = URIinit();
 URI uri(url);
 std::string path(uri.getPathAndQuery());
 if (path.empty()) path = "/";

 HTTPClientSession session(uri.getHost(), uri.getPort());
 HTTPRequest request(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
 HTTPResponse response;
 session.sendRequest(request);
 std::istream &is = session.receiveResponse( response );


在Kanzi建立需要的資源:

 
 struct KzuResourceManager* resourceManager 
  = kzuUIDomainGetResourceManager(kzaApplicationGetUIDomain(application));

 struct KzcMemoryManager* memoryManager = kzcMemoryGetManager(resourceManager);
 struct KzcImage* image;
 struct KzuImageTexture* texture;

把拿到的stream轉成 char* buffer再轉成Kanzi 的stream格式。

 std::ostringstream oss( std::ios_base::binary);
 oss << is.rdbuf();
 std::string strConst = oss.str();
 int size = strConst.length();
 
 const char* buffer = strConst.c_str();
 

 kzsException error;
 struct KzcInputStream* outstrem;
 error = kzcInputStreamCreateFromMemory(memoryManager, (kzByte*)buffer, size,  KZC_IO_STREAM_ENDIANNESS_UNSPECIFIED, &outstrem);


再用Kanzi的load png的Api: kzcImageLoadPNG,因為我已經知道抓下來是png的格式,若是其它的,要用其它的函式。之前本來想直接用kzuImageTextureCreateFromMemory,這個函式,但發現抓下來的是png,在設定 KZU_TEXTURE_CHANNELS時會有問題,因為png用的是索引色,不是用R8G8B8這種格式,還要把抓下來的raw data做轉換。
 error = kzcImageLoadPNG(memoryManager, outstrem, false, &image);
 /* Create texture from image. */
 result = kzuImageTextureCreateFromImage(resourceManager, "Widget Texture", 
  image, KZU_TEXTURE_FILTER_BILINEAR, 
  KZU_TEXTURE_WRAP_REPEAT, 0.0f, 
  &texture);
 kzsErrorForward(result);
 struct KzuObjectNode* screenNode 
  = kzuScreenToObjectNode(kzaApplicationGetScreen(application));
 
 struct KzuObjectNode* plane = kzuObjectNodeGetRelative(screenNode, "#Plane");
 result = kzuObjectNodeSetResourceIDResourceProperty(plane, KZU_PROPERTY_TYPE_TEXTURE,  kzuImageTextureToResource(texture));
 kzsErrorForward(result);


如果是直接從file中讀取,也可以用這個方式。之前拿來debug用的。把從網路上抓下來的部分改成下面這段就可以
 std::fstream myfile("myfile.png", std::ios::in | std::ios::binary);
 std::filebuf* pbuf = myfile.rdbuf();
 std::size_t size = pbuf->pubseekoff (0,myfile.end,myfile.in);
 pbuf->pubseekpos (0,myfile.in);
 char* buffer=new char[size];
 // get file data
 pbuf->sgetn (buffer,size);
 myfile.close();


Kanzi C++ project

除了在設定中的:
C/C++
 -Advanced: Compiled as -> 改成 Compiled as C++ Code 外

也要把
-Code Generation: Enable C++ Exceptions 設成 /EHsc

參照:http://msdn.microsoft.com/zh-tw/library/1deeycx5.aspx

如果沒改,在編一些第三方函式庫會編不過...




2014年9月4日 星期四

建立Custom Component

1. 建立自已的KzuUiComponentNodeClass

2. 在configuration->onStartup = startup; 時註冊Factory

3. 為了2. 所以要建2個function:
       a. FactoryCreate //用來create component
       b. RegisterToFactory //用來註冊, 如果有要註冊Custom message也可以寫在這
   這會對應到在Editor中,建立的Custom Component name

4. 如果有要處理Message, Handler加在KzuUiComponentNodeClass的initialize function中。

 要在editor preview的話,編GL_21_release版的,ps:要把Editor關掉才能把dll蓋掉。

註冊custom message


 const struct KzuMessageType* MESSAGE_TEXTUREFONT_CHANGRD;
 {
  struct KzcMemoryManager* memoryManager = kzcMemoryGetManager(factory);
  struct KzuMessageType* messageType;
                
  //Message.Custom.FontChange 對應Editor裡的Custom Message Name
  result = kzuMessageRegistryAddMessageType(memoryManager, "Message.Custom.FontChange", KZU_MESSAGE_ROUTING_TUNNELLING_BUBBLING,        &messageType);
  kzsErrorForward(result);

  MESSAGE_TEXTUREFONT_CHANGRD = messageType;
 }

取得/設定 custom property

 {
    struct KzuPropertyType* UV_SET; 
    struct KzcVector4 uvs;

    //get property type
    UV_SET = kzuPropertyRegistryFindPropertyType("uv_modify");
    kzsAssert(kzcIsValidPointer(UV_SET));

    //get property
    uvs = kzuObjectNodeGetVector4PropertyDefault(textrue_font->planeNode, UV_SET);
    uvs.data[0] = (kzFloat)(uv_sets[index].x);
    uvs.data[1] = (kzFloat)(uv_sets[index].y);
    uvs.data[2] = (kzFloat)(uv_sets[index].z);
    uvs.data[3] = (kzFloat)(uv_sets[index].w);

    //set property
    result = kzuObjectNodeSetVector4Property(textrue_font->planeNode, UV_SET, uvs);
    kzsErrorForward(result);
}
在scene node底下的mesh的material,可以從node就直接get property來set,不用去get它的material