2016年3月6日日曜日

UE4.x CSVのテスト1

CSVのテスト

// CSVファイルを読み込んでobj形式で出力するテスト
// TestCSV1(TEXT("Content/ThirdPerson/TextFiles/Mesh1.csv"));
void TestCSV1(const FString& path)
{
 // CSVデータ 9列
 // Vertex,Index,POSITION 0,POSITION 1,POSITION 2,TEXCOORD0 0,TEXCOORD0 1,TEXCOORD1 0,TEXCOORD1 1
 struct CSVData
 {
  int32 Vertex;
  int32 Index;
  FVector Pos;
  FVector2D Tex0;
  FVector2D Tex1;
 };

 // CSVデータの格納用
 TArray<CSVData> csvDaraArray;
 // テキストファイルの読み込み
 TArray<FString> lineArray;
 bool done = FFileHelper::LoadANSITextFileToStrings(*(FPaths::GameDir() + path), NULL, lineArray);
 if(!done) {
  UE_LOG(LogTemp, Error, TEXT("TestCSV1 %s Failed"), *path);
  return;
 }
 // 配列に格納
 CSVData csvData;
 for(int32 i = 0; i < lineArray.Num(); i++)
 {
  if(i == 0) continue; // 先頭スキップ
  TArray<FString> csvValues;
  int32 numElement = lineArray[i].ParseIntoArray(&csvValues, TEXT(","), true);

  if(9 != csvValues.Num()) {
   continue;
  }
  csvData.Vertex = FCString::Atoi(*csvValues[0]);
  csvData.Index = FCString::Atoi(*csvValues[1]);
  csvData.Pos.X = FCString::Atof(*csvValues[2]);
  csvData.Pos.Y = FCString::Atof(*csvValues[3]);
  csvData.Pos.Z = FCString::Atof(*csvValues[4]);
  csvData.Tex0.X = FCString::Atof(*csvValues[5]);
  csvData.Tex0.Y = FCString::Atof(*csvValues[6]);
  csvData.Tex1.X = FCString::Atof(*csvValues[7]);
  csvData.Tex1.Y = FCString::Atof(*csvValues[8]);

  csvDaraArray.Add(csvData);
 }

 UE_LOG(LogTemp, Display, TEXT("csvDaraArray num %d"), csvDaraArray.Num());

 TMap<int32, CSVData> indexCSVDataMap; // 頂点インデックスと頂点座標のマップ
 for(int32 i = 0; i < csvDaraArray.Num(); i++)
 {
  int32 idx = csvDaraArray[i].Index;

  CSVData* pData = indexCSVDataMap.Find(idx);
  if(!pData)
  {
   indexCSVDataMap.Add(idx, csvDaraArray[i]);
  }
 }
#ifdef _WIN64
 // Wavefront obj形式で出力するテスト
 char buf[512];

 // Group
 sprintf(buf, "g Mesh1\n");
 ::OutputDebugStringA(buf);
 // Pos
 for(int32 i = 0; i < indexCSVDataMap.Num(); i++)
 {
  sprintf(buf, "v %f %f %f\n", indexCSVDataMap[i].Pos.X, indexCSVDataMap[i].Pos.Y, indexCSVDataMap[i].Pos.Z);
  ::OutputDebugStringA(buf);
 }
 // Tex0
 for(int32 i = 0; i < indexCSVDataMap.Num(); i++)
 {
  sprintf(buf, "vt %f %f\n", indexCSVDataMap[i].Tex0.X, indexCSVDataMap[i].Tex0.Y);
  ::OutputDebugStringA(buf);
 }
 // Tex1
 //for(int32 i = 0; i < indexCSVDataMap.Num(); i++)
 //{
 // sprintf(buf, "vt %f %f\n", indexCSVDataMap[i].Tex1.X, indexCSVDataMap[i].Tex1.Y);
 // ::OutputDebugStringA(buf);
 //}
 // face
 for(int32 i = 0; i < csvDaraArray.Num(); i += 3)
 {
  int32 i0 = csvDaraArray[i + 0].Index + 1;
  int32 i1 = csvDaraArray[i + 1].Index + 1;
  int32 i2 = csvDaraArray[i + 2].Index + 1;

  sprintf(buf, "f %d/%d// %d/%d// %d/%d//\n", i0, i0, i1, i1, i2, i2);
  ::OutputDebugStringA(buf);
 }
#endif
}