前田稔(Maeda Minoru)の超初心者のプログラム入門
static const XMVECTORF32 eye = { 0.0f, 0.7f, 2.0f, 0.0f }; |
//★ ReadText X-FILE StorageFolder^ folder = Windows::ApplicationModel::Package::Current->InstalledLocation; //create_task(folder->GetFileAsync(L"BOXP3.x")).then([this](StorageFile^ file) create_task(folder->GetFileAsync(L"gal2.x")).then([this](StorageFile^ file) { return FileIO::ReadTextAsync(file); }).then([this](task<String^> previousTask) { try { String^ str = previousTask.get(); SetText(str); } catch (...) { OutputDebugString(L"X-FILE not found"); } }); |
std::wstring m_x; //X-FILE TEXT vector<wstring> VT; //X-FILE を行で切り分け int VT_size; //VT の大きさ //★ 入力した X-FILE TEXT を受け取ってモデルを生成 void Sample3DSceneRenderer::SetText(Platform::String^ text) { int num, pt, pw; m_x = text->Data(); // String を行で切り分ける(m_x⇒VT) VT.clear(); num = m_x.size(); for (pt = 0; pt<num;) { pw = pt; for (pt++; pt<num && m_x[pt] != L'\n'; pt++); if (pt >= num) break; pt++; Word = Word.assign(m_x, pw, pt - pw); VT.push_back(Word); } VT.push_back(L"}\r\n"); VT_size = VT.size(); |
vector<DirectX::XMFLOAT3> m_pos; // 頂点座標 vector<DirectX::XMFLOAT3> m_norm; // 法線ベクトル vector<unsigned short> m_idxP; // 頂点 Index の並び(角付) vector<unsigned short> m_idxN; // 法線 Index の並び(角付) vector<unsigned short> m_idxP3; // 頂点 Index(3P) の並び vector<unsigned short> m_idxN3; // 法線 Index(3P) の並び //★ 入力した X-FILE TEXT を受け取ってモデルを生成 void Sample3DSceneRenderer::SetText(Platform::String^ text) { ・・・ // 頂点座標を取得 m_pos.clear(); m_Line = m_Top; if (SetXMFLOAT3(L"Mesh ", &m_pos)) { SetShort(&m_idxP); } else { OutputDebugString(L"Mesh File Format Error\r\n"); return; } // 法線を取得 m_norm.clear(); m_Line = m_Top; if (SetXMFLOAT3(L"MeshNormals ", &m_norm)) { SetShort(&m_idxN); } // N角ポリゴン ⇒ 3角ポリゴン PX_P3(m_idxP, &m_idxP3); if (m_idxN.size() > 2) { PX_P3(m_idxN, &m_idxN3); } unsigned i; // 頂点データとインデックスデータを作成 m_indexCount = m_idxP3.size(); VertexPosition *Vertices = new VertexPosition[m_indexCount]; unsigned short *Indices = new unsigned short[m_indexCount]; for(i=0; i<m_indexCount; i++) { Vertices[i].pos = m_pos[m_idxP3[i]]; if (m_idxN3.size()>i) Vertices[i].norm = m_norm[m_idxN3[i]]; Indices[i]= i; //IndexはVerticesの順番と一致 } ・・・ |
bool Sample3DSceneRenderer::SetXMFLOAT3(String^ key, vector<DirectX::XMFLOAT3> *f3) { int num,i; float x, y, z; DirectX::XMFLOAT3 wf3; if (Search(key)==false) return false; m_Line++; m_Col = 0; Token(); num = _wtoi(Word.data()); if (num<3) { return false; } // 頂点座標を f3 に設定 for (i = 0; i<num; i++) { Token(); x = (float)_wtof(Word.data()); Token(); y = (float)_wtof(Word.data()); Token(); z = (float)_wtof(Word.data()); wf3 = XMFLOAT3(x, y, z); f3->push_back(wf3); } return true; } |
bool Sample3DSceneRenderer::SetShort(vector<unsigned short> *val) { int i,j,cn,num; unsigned short wk; Token(); num = _wtoi(Word.data()); if (num<3) { return false; } for(i=0; i<num; i++) { Token(); cn= _wtoi(Word.data()); val->push_back(cn); for(j=0; j<cn; j++) { Token(); wk = _wtoi(Word.data()); val->push_back(wk); } } return true; } |