// 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
}
|