mirror of
https://github.com/leozide/leocad
synced 2025-01-17 18:11:42 +01:00
Integrated Import Folder command from branch.
This commit is contained in:
parent
9469e2bdef
commit
45797c9d45
13 changed files with 543 additions and 215 deletions
|
@ -736,8 +736,61 @@ void PiecesLibrary::RemoveCategory(int Index)
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
// Pieces handling stuff
|
// Pieces handling stuff
|
||||||
|
|
||||||
|
bool PiecesLibrary::DeleteAllPieces()
|
||||||
|
{
|
||||||
|
FileDisk newbin, newidx, oldbin, oldidx;
|
||||||
|
char file1[LC_MAXPATH], file2[LC_MAXPATH], tmp[256];
|
||||||
|
|
||||||
|
strcpy(file1, m_LibraryPath);
|
||||||
|
strcat(file1, "pieces-b.old");
|
||||||
|
remove(file1);
|
||||||
|
strcpy(file2, m_LibraryPath);
|
||||||
|
strcat(file2, "pieces.bin");
|
||||||
|
rename(file2, file1);
|
||||||
|
|
||||||
|
if ((!oldbin.Open(file1, "rb")) ||
|
||||||
|
(!newbin.Open(file2, "wb")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
strcpy(file1, m_LibraryPath);
|
||||||
|
strcat(file1, "pieces-i.old");
|
||||||
|
remove(file1);
|
||||||
|
strcpy(file2, m_LibraryPath);
|
||||||
|
strcat(file2, "pieces.idx");
|
||||||
|
rename(file2, file1);
|
||||||
|
|
||||||
|
if ((!oldidx.Open(file1, "rb")) ||
|
||||||
|
(!newidx.Open(file2, "wb")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
oldidx.Seek(0, SEEK_SET);
|
||||||
|
oldidx.Read(tmp, 34);
|
||||||
|
newidx.Write(tmp, 34);
|
||||||
|
oldbin.Read(tmp, 32);
|
||||||
|
newbin.Write(tmp, 32);
|
||||||
|
|
||||||
|
// list of moved pieces
|
||||||
|
lcuint16 moved = 0;
|
||||||
|
newidx.WriteShort(&moved, 1);
|
||||||
|
|
||||||
|
// info at the end
|
||||||
|
lcuint32 binoff = newbin.GetPosition();
|
||||||
|
newidx.WriteLong(&binoff, 1);
|
||||||
|
lcuint16 count = 0;
|
||||||
|
newidx.WriteShort(&count, 1);
|
||||||
|
|
||||||
|
oldidx.Close();
|
||||||
|
oldbin.Close();
|
||||||
|
newidx.Close();
|
||||||
|
newbin.Close();
|
||||||
|
|
||||||
|
m_Modified = true;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// Remove pieces from the library
|
// Remove pieces from the library
|
||||||
bool PiecesLibrary::DeletePieces (PtrArray<PieceInfo>& Pieces)
|
bool PiecesLibrary::DeletePieces(PtrArray<const char>& Pieces)
|
||||||
{
|
{
|
||||||
FileDisk newbin, newidx, oldbin, oldidx;
|
FileDisk newbin, newidx, oldbin, oldidx;
|
||||||
char file1[LC_MAXPATH], file2[LC_MAXPATH], tmp[200];
|
char file1[LC_MAXPATH], file2[LC_MAXPATH], tmp[200];
|
||||||
|
@ -793,7 +846,7 @@ bool PiecesLibrary::DeletePieces (PtrArray<PieceInfo>& Pieces)
|
||||||
oldidx.Read(&name, LC_PIECE_NAME_LEN);
|
oldidx.Read(&name, LC_PIECE_NAME_LEN);
|
||||||
|
|
||||||
for (i = 0; i < Pieces.GetSize(); i++)
|
for (i = 0; i < Pieces.GetSize(); i++)
|
||||||
if (strcmp(name, Pieces[i]->m_strName) == 0)
|
if (strcmp(name, Pieces[i]) == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
if (i != Pieces.GetSize())
|
if (i != Pieces.GetSize())
|
||||||
|
@ -1400,7 +1453,7 @@ bool PiecesLibrary::ImportTexture (const char* Name)
|
||||||
// =============================================================================
|
// =============================================================================
|
||||||
// LDraw support
|
// LDraw support
|
||||||
|
|
||||||
bool PiecesLibrary::ImportLDrawPiece (const char* Filename)
|
bool PiecesLibrary::ImportLDrawPiece(const char* Filename, File* NewIdxFile, File* NewBinFile, File* OldIdxFile, File* OldBinFile)
|
||||||
{
|
{
|
||||||
LC_LDRAW_PIECE piece;
|
LC_LDRAW_PIECE piece;
|
||||||
|
|
||||||
|
@ -1408,16 +1461,112 @@ bool PiecesLibrary::ImportLDrawPiece (const char* Filename)
|
||||||
|
|
||||||
if (ReadLDrawPiece (Filename, &piece))
|
if (ReadLDrawPiece (Filename, &piece))
|
||||||
{
|
{
|
||||||
// if (FindPieceInfo (piece.name) != NULL)
|
char* Moved = strstr(piece.description, "~Moved to ");
|
||||||
// Sys_MessageBox ("Piece already exists in the library !");
|
if (Moved)
|
||||||
|
{
|
||||||
|
lcuint16 Count;
|
||||||
|
OldIdxFile->Seek(-(2+4+2), SEEK_END);
|
||||||
|
OldIdxFile->ReadShort(&Count, 1);
|
||||||
|
lcuint32 cs = Count * 2 * LC_PIECE_NAME_LEN;
|
||||||
|
OldIdxFile->Seek(-(long)(cs+2), SEEK_CUR);
|
||||||
|
|
||||||
if (SaveLDrawPiece (&piece))
|
lcuint32 Length = OldIdxFile->GetPosition();
|
||||||
Sys_MessageBox ("Piece successfully imported.");
|
void* Buffer = malloc(Length);
|
||||||
else
|
OldIdxFile->Seek(0, SEEK_SET);
|
||||||
|
OldIdxFile->Read(Buffer, Length);
|
||||||
|
NewIdxFile->Seek(0, SEEK_SET);
|
||||||
|
NewIdxFile->Write(Buffer, Length);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
Buffer = malloc(cs);
|
||||||
|
OldIdxFile->Read(Buffer, cs);
|
||||||
|
char* Reference = (char*)Buffer;
|
||||||
|
|
||||||
|
// Add piece to moved list.
|
||||||
|
if (!strchr(Moved, '\\') && !strchr(Moved, '/'))
|
||||||
|
{
|
||||||
|
Moved += strlen("~Moved to ");
|
||||||
|
_strupr(Moved);
|
||||||
|
|
||||||
|
char* Dst = NULL;
|
||||||
|
for (int i = 0; i < Count; i++)
|
||||||
|
{
|
||||||
|
if (!strncmp(&Reference[i*2*LC_PIECE_NAME_LEN], piece.name, LC_PIECE_NAME_LEN))
|
||||||
|
{
|
||||||
|
Dst = &Reference[i*LC_PIECE_NAME_LEN+LC_PIECE_NAME_LEN];
|
||||||
|
memset(Dst, 0, LC_PIECE_NAME_LEN);
|
||||||
|
memcpy(Dst, Moved, strlen(Moved));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Dst)
|
||||||
|
{
|
||||||
|
Buffer = realloc(Buffer, 2*LC_PIECE_NAME_LEN*(Count+1));
|
||||||
|
Reference = (char*)Buffer;
|
||||||
|
memset(&Reference[Count*2*LC_PIECE_NAME_LEN], 0, 2*LC_PIECE_NAME_LEN);
|
||||||
|
memcpy(&Reference[Count*2*LC_PIECE_NAME_LEN], piece.name, strlen(piece.name));
|
||||||
|
memcpy(&Reference[Count*2*LC_PIECE_NAME_LEN+LC_PIECE_NAME_LEN], Moved, strlen(Moved));
|
||||||
|
Count++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NewIdxFile->Write(Reference, Count*2*LC_PIECE_NAME_LEN);
|
||||||
|
NewIdxFile->WriteShort(&Count, 1);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
Buffer = malloc(4+2);
|
||||||
|
OldIdxFile->Seek(-(4+2), SEEK_END);
|
||||||
|
OldIdxFile->Read(Buffer, 4+2);
|
||||||
|
NewIdxFile->Write(Buffer, 4+2);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
OldBinFile->Seek(0, SEEK_END);
|
||||||
|
Length = OldBinFile->GetPosition();
|
||||||
|
Buffer = malloc(Length);
|
||||||
|
OldBinFile->Seek(0, SEEK_SET);
|
||||||
|
OldBinFile->Read(Buffer, Length);
|
||||||
|
NewBinFile->Seek(0, SEEK_SET);
|
||||||
|
NewBinFile->Write(Buffer, Length);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
// Delete existing piece.
|
||||||
|
// lcPtrArray<const char> Pieces;
|
||||||
|
// Pieces.Add(piece.name);
|
||||||
|
// DeletePieces(Pieces);
|
||||||
|
}
|
||||||
|
else if (!SaveLDrawPiece(&piece, NewIdxFile, NewBinFile, OldIdxFile, OldBinFile))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Error saving library after importing %s.\n", Filename);
|
||||||
Sys_MessageBox ("Error saving library.");
|
Sys_MessageBox ("Error saving library.");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
void* Buffer;
|
||||||
|
lcuint32 Length;
|
||||||
|
|
||||||
|
OldBinFile->Seek(0, SEEK_END);
|
||||||
|
Length = OldBinFile->GetPosition();
|
||||||
|
Buffer = malloc(Length);
|
||||||
|
OldBinFile->Seek(0, SEEK_SET);
|
||||||
|
OldBinFile->Read(Buffer, Length);
|
||||||
|
NewBinFile->Seek(0, SEEK_SET);
|
||||||
|
NewBinFile->Write(Buffer, Length);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
OldIdxFile->Seek(0, SEEK_END);
|
||||||
|
Length = OldIdxFile->GetPosition();
|
||||||
|
Buffer = malloc(Length);
|
||||||
|
OldIdxFile->Seek(0, SEEK_SET);
|
||||||
|
OldIdxFile->Read(Buffer, Length);
|
||||||
|
NewIdxFile->Seek(0, SEEK_SET);
|
||||||
|
NewIdxFile->Write(Buffer, Length);
|
||||||
|
free(Buffer);
|
||||||
|
|
||||||
|
fprintf(stderr, "Error reading file %s\n", Filename);
|
||||||
Sys_MessageBox ("Error reading file.");
|
Sys_MessageBox ("Error reading file.");
|
||||||
|
}
|
||||||
|
|
||||||
FreeLDrawPiece(&piece);
|
FreeLDrawPiece(&piece);
|
||||||
|
|
||||||
|
@ -2355,64 +2504,47 @@ bool ReadLDrawPiece(const char* filename, LC_LDRAW_PIECE* piece)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
bool SaveLDrawPiece(LC_LDRAW_PIECE* piece, File* NewIdxFile, File* NewBinFile, File* OldIdxFile, File* OldBinFile)
|
||||||
{
|
{
|
||||||
FileDisk newbin, newidx, oldbin, oldidx;
|
lcuint16 count, moved;
|
||||||
char file1[LC_MAXPATH], file2[LC_MAXPATH];
|
lcuint32 i, j, cs, binoff = 0, delta;
|
||||||
unsigned short count, moved;
|
|
||||||
unsigned long i, j, cs, binoff = 0, delta;
|
|
||||||
void* membuf;
|
void* membuf;
|
||||||
short scale, sb[6];
|
lcuint16 scale, sb[6];
|
||||||
PiecesLibrary *pLib = lcGetPiecesLibrary();
|
PiecesLibrary *pLib = lcGetPiecesLibrary();
|
||||||
|
|
||||||
strcpy(file1, pLib->GetLibraryPath());
|
File& NewIdx = *NewIdxFile;
|
||||||
strcat(file1, "pieces-b.old");
|
File& NewBin = *NewBinFile;
|
||||||
remove(file1);
|
File& OldIdx = *OldIdxFile;
|
||||||
strcpy(file2, pLib->GetLibraryPath());
|
File& OldBin = *OldBinFile;
|
||||||
strcat(file2, "pieces.bin");
|
|
||||||
rename(file2, file1);
|
|
||||||
|
|
||||||
if ((!oldbin.Open(file1, "rb")) ||
|
OldIdx.Seek(0, SEEK_SET);
|
||||||
(!newbin.Open(file2, "wb")))
|
OldBin.Seek(0, SEEK_SET);
|
||||||
return false;
|
|
||||||
|
|
||||||
strcpy(file1, pLib->GetLibraryPath());
|
OldIdx.Seek(-2, SEEK_END);
|
||||||
strcat(file1, "pieces-i.old");
|
OldIdx.ReadShort(&count, 1);
|
||||||
remove(file1);
|
OldIdx.Seek(34, SEEK_SET);
|
||||||
strcpy(file2, pLib->GetLibraryPath());
|
|
||||||
strcat(file2, "pieces.idx");
|
|
||||||
rename(file2, file1);
|
|
||||||
|
|
||||||
if ((!oldidx.Open(file1, "rb")) ||
|
|
||||||
(!newidx.Open(file2, "wb")))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
|
||||||
oldidx.Seek(-2, SEEK_END);
|
|
||||||
oldidx.ReadShort(&count, 1);
|
|
||||||
oldidx.Seek(34, SEEK_SET);
|
|
||||||
|
|
||||||
for (j = 0; j < count; j++)
|
for (j = 0; j < count; j++)
|
||||||
{
|
{
|
||||||
char name[LC_PIECE_NAME_LEN];
|
char name[LC_PIECE_NAME_LEN];
|
||||||
oldidx.Read(name, LC_PIECE_NAME_LEN);
|
OldIdx.Read(name, LC_PIECE_NAME_LEN);
|
||||||
|
|
||||||
if (strcmp(name, piece->name) == 0)
|
if (strcmp(name, piece->name) == 0)
|
||||||
{
|
{
|
||||||
oldidx.Seek(64+12+1+4, SEEK_CUR);
|
OldIdx.Seek(64+12+1+4, SEEK_CUR);
|
||||||
oldidx.ReadLong(&binoff, 1);
|
OldIdx.ReadLong(&binoff, 1);
|
||||||
oldidx.ReadLong(&delta, 1);
|
OldIdx.ReadLong(&delta, 1);
|
||||||
oldidx.Seek(-(LC_PIECE_NAME_LEN+64+12+1+4+4+4), SEEK_CUR);
|
OldIdx.Seek(-(LC_PIECE_NAME_LEN+64+12+1+4+4+4), SEEK_CUR);
|
||||||
delta += binoff;
|
delta += binoff;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
oldidx.Seek(64+12+1+4+4+4, SEEK_CUR);
|
OldIdx.Seek(64+12+1+4+4+4, SEEK_CUR);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (binoff == 0)
|
if (binoff == 0)
|
||||||
binoff = oldbin.GetLength();
|
binoff = OldBin.GetLength();
|
||||||
|
|
||||||
cs = oldidx.GetPosition();
|
cs = OldIdx.GetPosition();
|
||||||
membuf = malloc(cs);
|
membuf = malloc(cs);
|
||||||
if (membuf == NULL)
|
if (membuf == NULL)
|
||||||
{
|
{
|
||||||
|
@ -2420,9 +2552,9 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
oldidx.Seek(0, SEEK_SET);
|
OldIdx.Seek(0, SEEK_SET);
|
||||||
oldidx.Read(membuf, cs);
|
OldIdx.Read(membuf, cs);
|
||||||
newidx.Write(membuf, cs);
|
NewIdx.Write(membuf, cs);
|
||||||
free(membuf);
|
free(membuf);
|
||||||
|
|
||||||
membuf = malloc (binoff);
|
membuf = malloc (binoff);
|
||||||
|
@ -2432,9 +2564,9 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
oldbin.Seek(0, SEEK_SET);
|
OldBin.Seek(0, SEEK_SET);
|
||||||
oldbin.Read(membuf, binoff);
|
OldBin.Read(membuf, binoff);
|
||||||
newbin.Write(membuf, binoff);
|
NewBin.Write(membuf, binoff);
|
||||||
free(membuf);
|
free(membuf);
|
||||||
|
|
||||||
// Save piece
|
// Save piece
|
||||||
|
@ -2553,68 +2685,68 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
scale = 100;
|
scale = 100;
|
||||||
|
|
||||||
// Write the vertex data
|
// Write the vertex data
|
||||||
newbin.WriteLong(&piece->verts_count, 1);
|
NewBin.WriteLong(&piece->verts_count, 1);
|
||||||
for (i = 0; i < piece->verts_count; i++)
|
for (i = 0; i < piece->verts_count; i++)
|
||||||
{
|
{
|
||||||
float tmp[3] = { scale*piece->verts[(i*3)], scale*piece->verts[(i*3)+1], scale*piece->verts[(i*3)+2] };
|
float tmp[3] = { scale*piece->verts[(i*3)], scale*piece->verts[(i*3)+1], scale*piece->verts[(i*3)+2] };
|
||||||
short sh[3] = { (short)tmp[0], (short)tmp[1], (short)tmp[2] };
|
short sh[3] = { (short)tmp[0], (short)tmp[1], (short)tmp[2] };
|
||||||
newbin.WriteShort(&sh, 3);
|
NewBin.WriteShort(&sh, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write the connections information
|
// Write the connections information
|
||||||
for (s = 0, con = piece->connections; con; con = con->next)
|
for (s = 0, con = piece->connections; con; con = con->next)
|
||||||
s++;
|
s++;
|
||||||
newbin.WriteShort(&s, 1);
|
NewBin.WriteShort(&s, 1);
|
||||||
|
|
||||||
for (con = piece->connections; con; con = con->next)
|
for (con = piece->connections; con; con = con->next)
|
||||||
{
|
{
|
||||||
float tmp[3] = { scale*con->pos[0], scale*con->pos[1], scale*con->pos[2] };
|
float tmp[3] = { scale*con->pos[0], scale*con->pos[1], scale*con->pos[2] };
|
||||||
short sh[3] = { (short)tmp[0], (short)tmp[1], (short)tmp[2] };
|
short sh[3] = { (short)tmp[0], (short)tmp[1], (short)tmp[2] };
|
||||||
|
|
||||||
newbin.WriteByte(&con->type, 1);
|
NewBin.WriteByte(&con->type, 1);
|
||||||
newbin.WriteShort(sh, 3);
|
NewBin.WriteShort(sh, 3);
|
||||||
|
|
||||||
sh[0] = (short)(con->up[0]*(1<<14));
|
sh[0] = (short)(con->up[0]*(1<<14));
|
||||||
sh[1] = (short)(con->up[1]*(1<<14));
|
sh[1] = (short)(con->up[1]*(1<<14));
|
||||||
sh[2] = (short)(con->up[2]*(1<<14));
|
sh[2] = (short)(con->up[2]*(1<<14));
|
||||||
newbin.WriteShort(sh, 3);
|
NewBin.WriteShort(sh, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Textures
|
// Textures
|
||||||
for (bt = 0, tex = piece->textures; tex; tex = tex->next)
|
for (bt = 0, tex = piece->textures; tex; tex = tex->next)
|
||||||
bt++;
|
bt++;
|
||||||
newbin.WriteByte(&bt, 1);
|
NewBin.WriteByte(&bt, 1);
|
||||||
|
|
||||||
for (tex = piece->textures; tex; tex = tex->next)
|
for (tex = piece->textures; tex; tex = tex->next)
|
||||||
{
|
{
|
||||||
newbin.WriteByte(&tex->color, 1);
|
NewBin.WriteByte(&tex->color, 1);
|
||||||
newbin.Write(tex->name, 8);
|
NewBin.Write(tex->name, 8);
|
||||||
|
|
||||||
for (i = 0; i < 12; i++)
|
for (i = 0; i < 12; i++)
|
||||||
{
|
{
|
||||||
float tmp[1] = { tex->points[i]*scale };
|
float tmp[1] = { tex->points[i]*scale };
|
||||||
short sh[1] = { (short)tmp[0] };
|
short sh[1] = { (short)tmp[0] };
|
||||||
newbin.WriteShort(sh, 1);
|
NewBin.WriteShort(sh, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 12; i < 20; i++)
|
for (i = 12; i < 20; i++)
|
||||||
{
|
{
|
||||||
float tmp = tex->points[i];
|
float tmp = tex->points[i];
|
||||||
short sh[1] = { (short)tmp };
|
short sh[1] = { (short)tmp };
|
||||||
newbin.WriteShort(sh, 1);
|
NewBin.WriteShort(sh, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (s = 0, group = piece->groups; group; group = group->next)
|
for (s = 0, group = piece->groups; group; group = group->next)
|
||||||
s++;
|
s++;
|
||||||
newbin.WriteShort(&s, 1);
|
NewBin.WriteShort(&s, 1);
|
||||||
|
|
||||||
for (group = piece->groups; group; group = group->next)
|
for (group = piece->groups; group; group = group->next)
|
||||||
{
|
{
|
||||||
for (bt = 0; bt < 5; bt++)
|
for (bt = 0; bt < 5; bt++)
|
||||||
if (!group->connections[bt])
|
if (!group->connections[bt])
|
||||||
break;
|
break;
|
||||||
newbin.WriteByte(&bt, 1);
|
NewBin.WriteByte(&bt, 1);
|
||||||
|
|
||||||
for (bt = 0; bt < 5; bt++)
|
for (bt = 0; bt < 5; bt++)
|
||||||
{
|
{
|
||||||
|
@ -2624,15 +2756,15 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
for (s = 0, con = piece->connections; con; con = con->next, s++)
|
for (s = 0, con = piece->connections; con; con = con->next, s++)
|
||||||
if (con == group->connections[bt])
|
if (con == group->connections[bt])
|
||||||
break;
|
break;
|
||||||
newbin.WriteShort(&s, 1);
|
NewBin.WriteShort(&s, 1);
|
||||||
}
|
}
|
||||||
// TODO: make this endian-safe
|
// TODO: make this endian-safe
|
||||||
newbin.Write(group->drawinfo, group->infosize);
|
NewBin.Write(group->drawinfo, group->infosize);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now write the index
|
// Now write the index
|
||||||
newidx.Write(piece->name, LC_PIECE_NAME_LEN);
|
NewIdx.Write(piece->name, LC_PIECE_NAME_LEN);
|
||||||
newidx.Write(piece->description, 64);
|
NewIdx.Write(piece->description, 64);
|
||||||
|
|
||||||
for (i = 0; i < 6; i++)
|
for (i = 0; i < 6; i++)
|
||||||
{
|
{
|
||||||
|
@ -2642,7 +2774,7 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
// sb[i] = scale*box[i];
|
// sb[i] = scale*box[i];
|
||||||
sb[i] = (short)ff;
|
sb[i] = (short)ff;
|
||||||
}
|
}
|
||||||
newidx.WriteShort(sb, 6);
|
NewIdx.WriteShort(sb, 6);
|
||||||
|
|
||||||
// Calculate flags.
|
// Calculate flags.
|
||||||
bt = LC_PIECE_COUNT;
|
bt = LC_PIECE_COUNT;
|
||||||
|
@ -2653,63 +2785,58 @@ bool SaveLDrawPiece(LC_LDRAW_PIECE* piece)
|
||||||
bt |= LC_PIECE_MEDIUM;
|
bt |= LC_PIECE_MEDIUM;
|
||||||
|
|
||||||
if (piece->long_info)
|
if (piece->long_info)
|
||||||
bt |= LC_PIECE_LONGDATA;
|
bt |= LC_PIECE_LONGDATA_FILE;
|
||||||
|
|
||||||
newidx.WriteByte(&bt, 1);
|
NewIdx.WriteByte(&bt, 1);
|
||||||
|
|
||||||
i = 0;//PiecesLibrary::GetDefaultPieceGroup(piece->description);
|
i = 0;//PiecesLibrary::GetDefaultPieceGroup(piece->description);
|
||||||
newidx.WriteLong(&i, 1);
|
NewIdx.WriteLong(&i, 1);
|
||||||
newidx.WriteLong(&binoff, 1);
|
NewIdx.WriteLong(&binoff, 1);
|
||||||
|
|
||||||
i = newbin.GetLength() - binoff;
|
i = NewBin.GetLength() - binoff;
|
||||||
newidx.WriteLong(&i, 1);
|
NewIdx.WriteLong(&i, 1);
|
||||||
|
|
||||||
// replacing a piece
|
// replacing a piece
|
||||||
if (j != count)
|
if (j != count)
|
||||||
{
|
{
|
||||||
unsigned long d = newbin.GetPosition() - delta;
|
unsigned long d = NewBin.GetPosition() - delta;
|
||||||
oldidx.Seek (LC_PIECE_NAME_LEN+64+12+1+4+4+4, SEEK_CUR);
|
OldIdx.Seek (LC_PIECE_NAME_LEN+64+12+1+4+4+4, SEEK_CUR);
|
||||||
for (j++; j < count; j++)
|
for (j++; j < count; j++)
|
||||||
{
|
{
|
||||||
unsigned long dw;
|
lcuint32 dw;
|
||||||
char buf[LC_PIECE_NAME_LEN+64+12+1+4];
|
char buf[LC_PIECE_NAME_LEN+64+12+1+4];
|
||||||
oldidx.Read(buf, LC_PIECE_NAME_LEN+64+12+1+4);
|
OldIdx.Read(buf, LC_PIECE_NAME_LEN+64+12+1+4);
|
||||||
oldidx.ReadLong(&dw, 1);
|
OldIdx.ReadLong(&dw, 1);
|
||||||
dw += d;
|
dw += d;
|
||||||
newidx.Write(buf, LC_PIECE_NAME_LEN+64+12+1+4);
|
NewIdx.Write(buf, LC_PIECE_NAME_LEN+64+12+1+4);
|
||||||
newidx.WriteLong(&dw, 1);
|
NewIdx.WriteLong(&dw, 1);
|
||||||
oldidx.ReadLong(&dw, 1);
|
OldIdx.ReadLong(&dw, 1);
|
||||||
newidx.WriteLong(&dw, 1);
|
NewIdx.WriteLong(&dw, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
d = oldbin.GetLength()-delta;
|
d = OldBin.GetLength()-delta;
|
||||||
membuf = malloc (d);
|
membuf = malloc (d);
|
||||||
oldbin.Seek (delta, SEEK_SET);
|
OldBin.Seek(delta, SEEK_SET);
|
||||||
oldbin.Read (membuf, d);
|
OldBin.Read(membuf, d);
|
||||||
newbin.Write(membuf, d);
|
NewBin.Write(membuf, d);
|
||||||
free(membuf);
|
free(membuf);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
count++;
|
count++;
|
||||||
|
|
||||||
// Fix the end of the index
|
// Fix the end of the index
|
||||||
oldidx.Seek(-(2+4+2), SEEK_END);
|
OldIdx.Seek(-(2+4+2), SEEK_END);
|
||||||
oldidx.ReadShort(&moved, 1);
|
OldIdx.ReadShort(&moved, 1);
|
||||||
cs = 2+(moved*16);
|
cs = 2+(moved*LC_PIECE_NAME_LEN*2);
|
||||||
oldidx.Seek(-(long)cs, SEEK_CUR);
|
OldIdx.Seek(-(long)cs, SEEK_CUR);
|
||||||
membuf = malloc(cs);
|
membuf = malloc(cs);
|
||||||
oldidx.Read(membuf, cs);
|
OldIdx.Read(membuf, cs);
|
||||||
newidx.Write(membuf, cs);
|
NewIdx.Write(membuf, cs);
|
||||||
free(membuf);
|
free(membuf);
|
||||||
|
|
||||||
binoff = newbin.GetPosition();
|
binoff = NewBin.GetPosition();
|
||||||
newidx.WriteLong(&binoff, 1);
|
NewIdx.WriteLong(&binoff, 1);
|
||||||
newidx.WriteShort(&count, 1);
|
NewIdx.WriteShort(&count, 1);
|
||||||
|
|
||||||
oldidx.Close();
|
|
||||||
oldbin.Close();
|
|
||||||
newidx.Close();
|
|
||||||
newbin.Close();
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,11 +13,11 @@ class PieceInfo;
|
||||||
#define LC_CATEGORY_FILE_ID LC_FOURCC('C', 'A', 'T', 0)
|
#define LC_CATEGORY_FILE_ID LC_FOURCC('C', 'A', 'T', 0)
|
||||||
#define LC_CATEGORY_FILE_VERSION 0x0100
|
#define LC_CATEGORY_FILE_VERSION 0x0100
|
||||||
|
|
||||||
typedef struct
|
struct PiecesLibraryCategory
|
||||||
{
|
{
|
||||||
String Name;
|
String Name;
|
||||||
String Keywords;
|
String Keywords;
|
||||||
} PiecesLibraryCategory;
|
};
|
||||||
|
|
||||||
class PiecesLibrary
|
class PiecesLibrary
|
||||||
{
|
{
|
||||||
|
@ -74,11 +74,12 @@ public:
|
||||||
Texture* GetTexture(int index) const;
|
Texture* GetTexture(int index) const;
|
||||||
|
|
||||||
// File operations.
|
// File operations.
|
||||||
bool DeletePieces(PtrArray<PieceInfo>& Pieces);
|
bool DeleteAllPieces();
|
||||||
|
bool DeletePieces(PtrArray<const char>& Pieces);
|
||||||
bool LoadUpdate(const char* update);
|
bool LoadUpdate(const char* update);
|
||||||
bool DeleteTextures(char** Names, int NumTextures);
|
bool DeleteTextures(char** Names, int NumTextures);
|
||||||
bool ImportTexture(const char* Name);
|
bool ImportTexture(const char* Name);
|
||||||
bool ImportLDrawPiece(const char* Filename);
|
bool ImportLDrawPiece(const char* Filename, File* NewIdxFile, File* NewBinFile, File* OldIdxFile, File* OldBinFile);
|
||||||
|
|
||||||
// Set when pieces are added/removed from the library.
|
// Set when pieces are added/removed from the library.
|
||||||
bool m_Modified;
|
bool m_Modified;
|
||||||
|
@ -117,37 +118,37 @@ protected:
|
||||||
// ============================================================================
|
// ============================================================================
|
||||||
|
|
||||||
// This should be cleaned and moved to the PiecesLibrary class
|
// This should be cleaned and moved to the PiecesLibrary class
|
||||||
typedef struct connection_s
|
struct connection_t
|
||||||
{
|
{
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
float pos[3];
|
float pos[3];
|
||||||
float up[3];
|
float up[3];
|
||||||
connection_s* next;
|
connection_t* next;
|
||||||
} connection_t;
|
};
|
||||||
|
|
||||||
typedef struct group_s
|
struct group_t
|
||||||
{
|
{
|
||||||
connection_t* connections[5];
|
connection_t* connections[5];
|
||||||
void* drawinfo;
|
void* drawinfo;
|
||||||
unsigned long infosize;
|
unsigned long infosize;
|
||||||
group_s* next;
|
group_t* next;
|
||||||
} group_t;
|
};
|
||||||
|
|
||||||
typedef struct lineinfo_s
|
struct lineinfo_t
|
||||||
{
|
{
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
unsigned char color;
|
unsigned char color;
|
||||||
float points[12];
|
float points[12];
|
||||||
lineinfo_s* next;
|
lineinfo_t* next;
|
||||||
} lineinfo_t;
|
};
|
||||||
|
|
||||||
typedef struct texture_s
|
struct texture_t
|
||||||
{
|
{
|
||||||
float points[20];
|
float points[20];
|
||||||
unsigned char color;
|
unsigned char color;
|
||||||
char name[9];
|
char name[9];
|
||||||
texture_s* next;
|
texture_t* next;
|
||||||
} texture_t;
|
};
|
||||||
|
|
||||||
struct LC_LDRAW_PIECE
|
struct LC_LDRAW_PIECE
|
||||||
{
|
{
|
||||||
|
@ -162,7 +163,7 @@ struct LC_LDRAW_PIECE
|
||||||
};
|
};
|
||||||
|
|
||||||
bool ReadLDrawPiece(const char* filename, LC_LDRAW_PIECE* piece);
|
bool ReadLDrawPiece(const char* filename, LC_LDRAW_PIECE* piece);
|
||||||
bool SaveLDrawPiece(LC_LDRAW_PIECE* piece);
|
bool SaveLDrawPiece(LC_LDRAW_PIECE* piece, File* NewIdxFile, File* NewBinFile, File* OldIdxFile, File* OldBinFile);
|
||||||
void FreeLDrawPiece(LC_LDRAW_PIECE* piece);
|
void FreeLDrawPiece(LC_LDRAW_PIECE* piece);
|
||||||
|
|
||||||
#endif // _LIBRARY_H_
|
#endif // _LIBRARY_H_
|
||||||
|
|
|
@ -479,7 +479,7 @@ void Piece::MinIntersectDist(LC_CLICKLINE* pLine)
|
||||||
|
|
||||||
float* verts = m_pPieceInfo->m_fVertexArray;
|
float* verts = m_pPieceInfo->m_fVertexArray;
|
||||||
|
|
||||||
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
lcuint32* info = (lcuint32*)m_pDrawInfo, colors, i;
|
lcuint32* info = (lcuint32*)m_pDrawInfo, colors, i;
|
||||||
colors = *info;
|
colors = *info;
|
||||||
|
@ -698,7 +698,7 @@ bool Piece::IntersectsVolume(const Vector4* Planes, int NumPlanes)
|
||||||
float* verts = m_pPieceInfo->m_fVertexArray;
|
float* verts = m_pPieceInfo->m_fVertexArray;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
lcuint32* info = (lcuint32*)m_pDrawInfo, colors, i;
|
lcuint32* info = (lcuint32*)m_pDrawInfo, colors, i;
|
||||||
colors = *info;
|
colors = *info;
|
||||||
|
@ -904,7 +904,7 @@ void Piece::BuildDrawInfo()
|
||||||
|
|
||||||
if (add)
|
if (add)
|
||||||
{
|
{
|
||||||
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
lcuint32* p, curcol, colors;
|
lcuint32* p, curcol, colors;
|
||||||
p = (lcuint32*)dg->drawinfo;
|
p = (lcuint32*)dg->drawinfo;
|
||||||
|
@ -956,7 +956,7 @@ void Piece::BuildDrawInfo()
|
||||||
vert += (colcount*4)+1;
|
vert += (colcount*4)+1;
|
||||||
|
|
||||||
// Build the info
|
// Build the info
|
||||||
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
m_pDrawInfo = malloc(vert*sizeof(lcuint32));
|
m_pDrawInfo = malloc(vert*sizeof(lcuint32));
|
||||||
lcuint32* drawinfo = (lcuint32*)m_pDrawInfo;
|
lcuint32* drawinfo = (lcuint32*)m_pDrawInfo;
|
||||||
|
@ -1193,7 +1193,7 @@ void Piece::Render(bool bLighting, bool bEdges, unsigned char* nLastColor, bool*
|
||||||
glDisable(GL_TEXTURE_2D);
|
glDisable(GL_TEXTURE_2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (m_pPieceInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
lcuint32 colors, *info = (lcuint32*)m_pDrawInfo;
|
lcuint32 colors, *info = (lcuint32*)m_pDrawInfo;
|
||||||
colors = *info;
|
colors = *info;
|
||||||
|
|
|
@ -427,9 +427,9 @@ void PieceInfo::LoadInformation()
|
||||||
|
|
||||||
while (*bytes)
|
while (*bytes)
|
||||||
{
|
{
|
||||||
if (*bytes == LC_MESH)
|
if (*bytes == LC_MESH)
|
||||||
{
|
{
|
||||||
if ((fixverts > 65535) || (m_nFlags & LC_PIECE_LONGDATA))
|
if (m_nFlags & LC_PIECE_LONGDATA_FILE)
|
||||||
{
|
{
|
||||||
lcuint32 colors, *p;
|
lcuint32 colors, *p;
|
||||||
p = (lcuint32*)(bytes + 1);
|
p = (lcuint32*)(bytes + 1);
|
||||||
|
@ -502,15 +502,8 @@ void PieceInfo::LoadInformation()
|
||||||
|
|
||||||
m_fVertexArray = (float*)malloc(3*sizeof(float)*verts);
|
m_fVertexArray = (float*)malloc(3*sizeof(float)*verts);
|
||||||
m_nVertexCount = verts;
|
m_nVertexCount = verts;
|
||||||
if ((verts > 65535) || (quads > 65535) || (fixquads > 65535))
|
if (verts > 65535 || quads > 65535)
|
||||||
{
|
m_nFlags |= LC_PIECE_LONGDATA_INDICES;
|
||||||
if ((m_nFlags & LC_PIECE_LONGDATA) == 0)
|
|
||||||
{
|
|
||||||
m_nFlags |= LC_PIECE_LONGDATA | LC_PIECE_LONGDATA_RUNTIME;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
m_nFlags &= ~(LC_PIECE_LONGDATA | LC_PIECE_LONGDATA_RUNTIME);
|
|
||||||
|
|
||||||
// Copy the 'fixed' vertexes
|
// Copy the 'fixed' vertexes
|
||||||
shorts = (lcint16*)(longs + 1);
|
shorts = (lcint16*)(longs + 1);
|
||||||
|
@ -540,17 +533,17 @@ void PieceInfo::LoadInformation()
|
||||||
bytes += sizeof(lcuint16);
|
bytes += sizeof(lcuint16);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Currently there's only one type of drawinfo (mesh or stud)
|
// Currently there's only one type of drawinfo (mesh or stud)
|
||||||
// per group but this will change in the future.
|
// per group but this will change in the future.
|
||||||
switch (*bytes)
|
switch (*bytes)
|
||||||
{
|
{
|
||||||
case LC_MESH:
|
case LC_MESH:
|
||||||
if ((fixverts > 65535) || (fixquads > 65535))
|
if (m_nFlags & LC_PIECE_LONGDATA_FILE)
|
||||||
{
|
{
|
||||||
lcuint32 colors, *p;
|
lcuint32 colors, *p;
|
||||||
bytes++;
|
bytes++;
|
||||||
p = (lcuint32*)bytes;
|
p = (lcuint32*)bytes;
|
||||||
*p = LCUINT32(*p);
|
*p = LCUINT32(*p);
|
||||||
colors = *p;
|
colors = *p;
|
||||||
p++;
|
p++;
|
||||||
|
|
||||||
|
@ -608,7 +601,7 @@ void PieceInfo::LoadInformation()
|
||||||
|
|
||||||
i = (unsigned char*)p - bytes;
|
i = (unsigned char*)p - bytes;
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
pGroup->drawinfo = malloc(i*sizeof(lcuint32)/sizeof(lcuint16));
|
pGroup->drawinfo = malloc(i*sizeof(lcuint32)/sizeof(lcuint16));
|
||||||
longs = (lcuint32*)pGroup->drawinfo;
|
longs = (lcuint32*)pGroup->drawinfo;
|
||||||
|
@ -656,7 +649,7 @@ void PieceInfo::LoadInformation()
|
||||||
// colors + 2*num_prim + sides*prims
|
// colors + 2*num_prim + sides*prims
|
||||||
size = 9+SIDES*11;
|
size = 9+SIDES*11;
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
||||||
longs = (lcuint32*)pGroup->drawinfo;
|
longs = (lcuint32*)pGroup->drawinfo;
|
||||||
|
@ -815,7 +808,7 @@ void PieceInfo::LoadInformation()
|
||||||
// colors + 2*num_prim + sides*prims
|
// colors + 2*num_prim + sides*prims
|
||||||
size = 9+SIDES*20;
|
size = 9+SIDES*20;
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
||||||
longs = (lcuint32*)pGroup->drawinfo;
|
longs = (lcuint32*)pGroup->drawinfo;
|
||||||
|
@ -1046,7 +1039,7 @@ void PieceInfo::LoadInformation()
|
||||||
// colors + 2*num_prim + sides*prims
|
// colors + 2*num_prim + sides*prims
|
||||||
size = 9+SIDES*11;
|
size = 9+SIDES*11;
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
||||||
longs = (lcuint32*)pGroup->drawinfo;
|
longs = (lcuint32*)pGroup->drawinfo;
|
||||||
|
@ -1205,7 +1198,7 @@ void PieceInfo::LoadInformation()
|
||||||
// colors + 2*num_prim + sides*prims
|
// colors + 2*num_prim + sides*prims
|
||||||
size = 9+SIDES*20;
|
size = 9+SIDES*20;
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
pGroup->drawinfo = malloc(sizeof(lcuint32)*size);
|
||||||
longs = (lcuint32*)pGroup->drawinfo;
|
longs = (lcuint32*)pGroup->drawinfo;
|
||||||
|
@ -1452,10 +1445,8 @@ void PieceInfo::FreeInformation()
|
||||||
m_pTextures = NULL;
|
m_pTextures = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA_RUNTIME)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
m_nFlags &= ~LC_PIECE_LONGDATA_INDICES;
|
||||||
m_nFlags &= ~(LC_PIECE_LONGDATA | LC_PIECE_LONGDATA_RUNTIME);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Zoom extents for the preview window and print catalog
|
// Zoom extents for the preview window and print catalog
|
||||||
|
@ -1656,7 +1647,7 @@ void PieceInfo::RenderPiece(int nColor)
|
||||||
sh = m_nGroupCount;
|
sh = m_nGroupCount;
|
||||||
for (pGroup = m_pGroups; sh--; pGroup++)
|
for (pGroup = m_pGroups; sh--; pGroup++)
|
||||||
{
|
{
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
lcuint32* info, colors;
|
lcuint32* info, colors;
|
||||||
|
|
||||||
|
@ -1750,7 +1741,7 @@ void PieceInfo::WriteWavefront(FILE* file, unsigned char color, unsigned long* s
|
||||||
|
|
||||||
for (group = 0; group < m_nGroupCount; group++)
|
for (group = 0; group < m_nGroupCount; group++)
|
||||||
{
|
{
|
||||||
if (m_nFlags & LC_PIECE_LONGDATA)
|
if (m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
unsigned long* info = (unsigned long*)m_pGroups[group].drawinfo;
|
unsigned long* info = (unsigned long*)m_pGroups[group].drawinfo;
|
||||||
unsigned long count, colors = *info;
|
unsigned long count, colors = *info;
|
||||||
|
|
|
@ -1,7 +1,3 @@
|
||||||
//
|
|
||||||
// pieceinf.h
|
|
||||||
////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
#ifndef _PIECEINF_H_
|
#ifndef _PIECEINF_H_
|
||||||
#define _PIECEINF_H_
|
#define _PIECEINF_H_
|
||||||
|
|
||||||
|
@ -11,38 +7,38 @@
|
||||||
#endif
|
#endif
|
||||||
#include "algebra.h"
|
#include "algebra.h"
|
||||||
|
|
||||||
#define LC_PIECE_COUNT 0x01 // Count this piece in the totals ?
|
#define LC_PIECE_COUNT 0x01 // Count this piece in the totals ?
|
||||||
#define LC_PIECE_LONGDATA 0x02 // unsigned long/short index
|
#define LC_PIECE_LONGDATA_FILE 0x02 // unsigned long/short index
|
||||||
#define LC_PIECE_CCW 0x04 // Use back-face culling
|
#define LC_PIECE_CCW 0x04 // Use back-face culling
|
||||||
#define LC_PIECE_SMALL 0x10 // scale = 10000
|
#define LC_PIECE_SMALL 0x10 // scale = 10000
|
||||||
#define LC_PIECE_MEDIUM 0x20 // scale = 1000 (otherwise = 100)
|
#define LC_PIECE_MEDIUM 0x20 // scale = 1000 (otherwise = 100)
|
||||||
#define LC_PIECE_LONGDATA_RUNTIME 0x40 // If the original data is 16 bits but we expanded to 32 bits
|
#define LC_PIECE_LONGDATA_INDICES 0x40 // unsigned long/short index
|
||||||
|
|
||||||
#define LC_PIECE_NAME_LEN 256
|
#define LC_PIECE_NAME_LEN 256
|
||||||
|
|
||||||
class File;
|
class File;
|
||||||
class Texture;
|
class Texture;
|
||||||
|
|
||||||
typedef struct
|
struct CONNECTIONINFO
|
||||||
{
|
{
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
float center[3];
|
float center[3];
|
||||||
float normal[3];
|
float normal[3];
|
||||||
} CONNECTIONINFO;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct DRAWGROUP
|
||||||
{
|
{
|
||||||
unsigned short connections[6];
|
unsigned short connections[6];
|
||||||
void* drawinfo;
|
void* drawinfo;
|
||||||
} DRAWGROUP;
|
};
|
||||||
|
|
||||||
typedef struct TEXTURE
|
struct TEXTURE
|
||||||
{
|
{
|
||||||
Texture* texture;
|
Texture* texture;
|
||||||
unsigned char color;
|
unsigned char color;
|
||||||
float vertex[4][3];
|
float vertex[4][3];
|
||||||
float coords[4][2];
|
float coords[4][2];
|
||||||
} TEXTURE;
|
};
|
||||||
|
|
||||||
unsigned char ConvertColor(int c);
|
unsigned char ConvertColor(int c);
|
||||||
|
|
||||||
|
|
|
@ -4190,7 +4190,7 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam)
|
||||||
|
|
||||||
unsigned short g;
|
unsigned short g;
|
||||||
for (g = 0; g < pInfo->m_nGroupCount; g++)
|
for (g = 0; g < pInfo->m_nGroupCount; g++)
|
||||||
if (pInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (pInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
{
|
{
|
||||||
unsigned long* info = (unsigned long*)pInfo->m_pGroups[g].drawinfo;
|
unsigned long* info = (unsigned long*)pInfo->m_pGroups[g].drawinfo;
|
||||||
unsigned long count, curcolor, colors = *info;
|
unsigned long count, curcolor, colors = *info;
|
||||||
|
|
|
@ -181,32 +181,30 @@ typedef enum
|
||||||
LC_CURSOR_COUNT
|
LC_CURSOR_COUNT
|
||||||
} LC_CURSOR_TYPE;
|
} LC_CURSOR_TYPE;
|
||||||
|
|
||||||
// Piece connections (complicated and wastes memory but fast).
|
// Piece connections.
|
||||||
|
struct CONNECTION
|
||||||
typedef struct CONNECTION
|
|
||||||
{
|
{
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
float center[3];
|
float center[3];
|
||||||
float normal[3];
|
float normal[3];
|
||||||
CONNECTION* link;
|
CONNECTION* link;
|
||||||
Piece* owner;
|
Piece* owner;
|
||||||
} CONNECTION;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct CONNECTION_ENTRY
|
||||||
{
|
{
|
||||||
Piece* owner;
|
Piece* owner;
|
||||||
CONNECTION** cons; // pointers to the structures in each piece
|
CONNECTION** cons; // pointers to the structures in each piece
|
||||||
unsigned short numcons;
|
unsigned short numcons;
|
||||||
} CONNECTION_ENTRY;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct CONNECTION_TYPE
|
||||||
{
|
{
|
||||||
CONNECTION_ENTRY* entries;
|
CONNECTION_ENTRY* entries;
|
||||||
unsigned short numentries;
|
unsigned short numentries;
|
||||||
} CONNECTION_TYPE;
|
};
|
||||||
|
|
||||||
// Select by Name dialog data
|
// Select by Name dialog data
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
LC_SELDLG_PIECE,
|
LC_SELDLG_PIECE,
|
||||||
|
@ -215,15 +213,15 @@ typedef enum
|
||||||
LC_SELDLG_GROUP
|
LC_SELDLG_GROUP
|
||||||
} LC_SEL_DATA_TYPE;
|
} LC_SEL_DATA_TYPE;
|
||||||
|
|
||||||
typedef struct
|
struct LC_SEL_DATA
|
||||||
{
|
{
|
||||||
const char* name;
|
const char* name;
|
||||||
unsigned char type;
|
unsigned char type;
|
||||||
bool selected;
|
bool selected;
|
||||||
void* pointer;
|
void* pointer;
|
||||||
} LC_SEL_DATA;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_PIECE_MODIFY
|
||||||
{
|
{
|
||||||
Piece* piece;
|
Piece* piece;
|
||||||
Vector3 Position;
|
Vector3 Position;
|
||||||
|
@ -233,9 +231,9 @@ typedef struct
|
||||||
int to;
|
int to;
|
||||||
bool hidden;
|
bool hidden;
|
||||||
int color;
|
int color;
|
||||||
} LC_PIECE_MODIFY;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_CAMERA_MODIFY
|
||||||
{
|
{
|
||||||
Camera* camera;
|
Camera* camera;
|
||||||
Vector3 Eye;
|
Vector3 Eye;
|
||||||
|
@ -246,7 +244,7 @@ typedef struct
|
||||||
float znear;
|
float znear;
|
||||||
float zfar;
|
float zfar;
|
||||||
bool hidden;
|
bool hidden;
|
||||||
} LC_CAMERA_MODIFY;
|
};
|
||||||
|
|
||||||
// Image
|
// Image
|
||||||
|
|
||||||
|
@ -259,7 +257,7 @@ typedef enum
|
||||||
LC_IMAGE_AVI
|
LC_IMAGE_AVI
|
||||||
} LC_IMAGE_FORMATS;
|
} LC_IMAGE_FORMATS;
|
||||||
|
|
||||||
typedef struct
|
struct LC_IMAGE_OPTS
|
||||||
{
|
{
|
||||||
unsigned char quality;
|
unsigned char quality;
|
||||||
bool interlaced;
|
bool interlaced;
|
||||||
|
@ -268,9 +266,9 @@ typedef struct
|
||||||
unsigned char background[3];
|
unsigned char background[3];
|
||||||
float pause;
|
float pause;
|
||||||
unsigned int format;
|
unsigned int format;
|
||||||
} LC_IMAGE_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_IMAGEDLG_OPTS
|
||||||
{
|
{
|
||||||
char filename[LC_MAXPATH];
|
char filename[LC_MAXPATH];
|
||||||
unsigned short from;
|
unsigned short from;
|
||||||
|
@ -279,7 +277,7 @@ typedef struct
|
||||||
unsigned short width;
|
unsigned short width;
|
||||||
unsigned short height;
|
unsigned short height;
|
||||||
LC_IMAGE_OPTS imopts;
|
LC_IMAGE_OPTS imopts;
|
||||||
} LC_IMAGEDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
LC_DLG_FILE_OPEN_PROJECT,
|
LC_DLG_FILE_OPEN_PROJECT,
|
||||||
|
@ -287,6 +285,7 @@ typedef enum {
|
||||||
LC_DLG_FILE_MERGE_PROJECT,
|
LC_DLG_FILE_MERGE_PROJECT,
|
||||||
LC_DLG_FILE_OPEN,
|
LC_DLG_FILE_OPEN,
|
||||||
LC_DLG_FILE_SAVE,
|
LC_DLG_FILE_SAVE,
|
||||||
|
LC_DLG_DIRECTORY_BROWSE,
|
||||||
LC_DLG_PICTURE_SAVE,
|
LC_DLG_PICTURE_SAVE,
|
||||||
LC_DLG_HTML,
|
LC_DLG_HTML,
|
||||||
LC_DLG_POVRAY,
|
LC_DLG_POVRAY,
|
||||||
|
@ -312,34 +311,40 @@ typedef enum
|
||||||
LC_FILEOPENDLG_LUP
|
LC_FILEOPENDLG_LUP
|
||||||
} LC_FILEOPENDLG_TYPES;
|
} LC_FILEOPENDLG_TYPES;
|
||||||
|
|
||||||
typedef struct
|
struct LC_FILEOPENDLG_OPTS
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
char path[LC_MAXPATH];
|
char path[LC_MAXPATH];
|
||||||
int numfiles;
|
int numfiles;
|
||||||
char** filenames;
|
char** filenames;
|
||||||
} LC_FILEOPENDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
LC_FILESAVEDLG_LCF,
|
LC_FILESAVEDLG_LCF,
|
||||||
} LC_FILESAVEDLG_TYPES;
|
} LC_FILESAVEDLG_TYPES;
|
||||||
|
|
||||||
typedef struct
|
struct LC_FILESAVEDLG_OPTS
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
char path[LC_MAXPATH];
|
char path[LC_MAXPATH];
|
||||||
} LC_FILESAVEDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_DLG_DIRECTORY_BROWSE_OPTS
|
||||||
|
{
|
||||||
|
const char* Title;
|
||||||
|
char Path[LC_MAXPATH];
|
||||||
|
};
|
||||||
|
|
||||||
|
struct LC_POVRAYDLG_OPTS
|
||||||
{
|
{
|
||||||
bool render;
|
bool render;
|
||||||
char povpath[LC_MAXPATH];
|
char povpath[LC_MAXPATH];
|
||||||
char outpath[LC_MAXPATH];
|
char outpath[LC_MAXPATH];
|
||||||
char libpath[LC_MAXPATH];
|
char libpath[LC_MAXPATH];
|
||||||
} LC_POVRAYDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_HTMLDLG_OPTS
|
||||||
{
|
{
|
||||||
char path[LC_MAXPATH];
|
char path[LC_MAXPATH];
|
||||||
bool singlepage;
|
bool singlepage;
|
||||||
|
@ -350,9 +355,9 @@ typedef struct
|
||||||
bool highlight;
|
bool highlight;
|
||||||
bool htmlext;
|
bool htmlext;
|
||||||
LC_IMAGEDLG_OPTS imdlg;
|
LC_IMAGEDLG_OPTS imdlg;
|
||||||
} LC_HTMLDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_ARRAYDLG_OPTS
|
||||||
{
|
{
|
||||||
unsigned short n1DCount;
|
unsigned short n1DCount;
|
||||||
unsigned short n2DCount;
|
unsigned short n2DCount;
|
||||||
|
@ -362,9 +367,9 @@ typedef struct
|
||||||
float f3D[3];
|
float f3D[3];
|
||||||
float fMove[3];
|
float fMove[3];
|
||||||
float fRotate[3];
|
float fRotate[3];
|
||||||
} LC_ARRAYDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_PROPERTIESDLG_OPTS
|
||||||
{
|
{
|
||||||
char strAuthor[101];
|
char strAuthor[101];
|
||||||
char strDescription[101];
|
char strDescription[101];
|
||||||
|
@ -374,9 +379,9 @@ typedef struct
|
||||||
char** names;
|
char** names;
|
||||||
unsigned short* count;
|
unsigned short* count;
|
||||||
int lines;
|
int lines;
|
||||||
} LC_PROPERTIESDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_GROUPEDITDLG_OPTS
|
||||||
{
|
{
|
||||||
int piececount;
|
int piececount;
|
||||||
Piece** pieces;
|
Piece** pieces;
|
||||||
|
@ -384,9 +389,9 @@ typedef struct
|
||||||
int groupcount;
|
int groupcount;
|
||||||
Group** groups;
|
Group** groups;
|
||||||
Group** groupsgroups;
|
Group** groupsgroups;
|
||||||
} LC_GROUPEDITDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_PREFERENCESDLG_OPTS
|
||||||
{
|
{
|
||||||
int nMouse;
|
int nMouse;
|
||||||
int nSaveInterval;
|
int nSaveInterval;
|
||||||
|
@ -407,12 +412,12 @@ typedef struct
|
||||||
float fGrad2[3];
|
float fGrad2[3];
|
||||||
char strFooter[256];
|
char strFooter[256];
|
||||||
char strHeader[256];
|
char strHeader[256];
|
||||||
} LC_PREFERENCESDLG_OPTS;
|
};
|
||||||
|
|
||||||
typedef struct
|
struct LC_CATEGORYDLG_OPTS
|
||||||
{
|
{
|
||||||
String Name;
|
String Name;
|
||||||
String Keywords;
|
String Keywords;
|
||||||
} LC_CATEGORYDLG_OPTS;
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -498,6 +498,7 @@ BEGIN
|
||||||
MENUITEM "&Print Catalog...", ID_LIBDLG_FILE_PRINTCATALOG
|
MENUITEM "&Print Catalog...", ID_LIBDLG_FILE_PRINTCATALOG
|
||||||
MENUITEM "Load &Update...", ID_LIBDLG_FILE_MERGEUPDATE
|
MENUITEM "Load &Update...", ID_LIBDLG_FILE_MERGEUPDATE
|
||||||
MENUITEM "&Import Piece...", ID_FILE_IMPORTPIECE
|
MENUITEM "&Import Piece...", ID_FILE_IMPORTPIECE
|
||||||
|
MENUITEM "Import &Folder...", ID_FILE_IMPORTFOLDER
|
||||||
MENUITEM "Te&xtures...", ID_LIBDLG_FILE_TEXTURES
|
MENUITEM "Te&xtures...", ID_LIBDLG_FILE_TEXTURES
|
||||||
MENUITEM SEPARATOR
|
MENUITEM SEPARATOR
|
||||||
MENUITEM "Close", IDOK
|
MENUITEM "Close", IDOK
|
||||||
|
|
166
win/Libdlg.cpp
166
win/Libdlg.cpp
|
@ -137,6 +137,103 @@ BOOL CLibraryDlg::OnInitDialog()
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool CLibraryDlg::ImportPieces(const ObjArray<String>& FileList)
|
||||||
|
{
|
||||||
|
char file1[LC_MAXPATH], file2[LC_MAXPATH];
|
||||||
|
PiecesLibrary* Library = lcGetPiecesLibrary();
|
||||||
|
FileDisk DiskIdx, DiskBin;
|
||||||
|
|
||||||
|
strcpy(file1, Library->GetLibraryPath());
|
||||||
|
strcat(file1, "pieces.idx");
|
||||||
|
strcpy(file2, Library->GetLibraryPath());
|
||||||
|
strcat(file2, "pieces.bin");
|
||||||
|
|
||||||
|
if ((!DiskIdx.Open(file1, "rb")) || (!DiskBin.Open(file2, "rb")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
FileMem IdxFile1, IdxFile2, BinFile1, BinFile2;
|
||||||
|
long Length;
|
||||||
|
|
||||||
|
Length = DiskIdx.GetLength();
|
||||||
|
IdxFile1.SetLength(Length);
|
||||||
|
DiskIdx.Read(IdxFile1.GetBuffer(), Length);
|
||||||
|
DiskIdx.Close();
|
||||||
|
|
||||||
|
Length = DiskBin.GetLength();
|
||||||
|
BinFile1.SetLength(Length);
|
||||||
|
DiskBin.Read(BinFile1.GetBuffer(), Length);
|
||||||
|
DiskBin.Close();
|
||||||
|
|
||||||
|
FileMem* NewIdx = &IdxFile1;
|
||||||
|
FileMem* NewBin = &BinFile1;
|
||||||
|
FileMem* OldIdx = &IdxFile2;
|
||||||
|
FileMem* OldBin = &BinFile2;
|
||||||
|
|
||||||
|
CProgressDlg Dlg("Importing pieces");
|
||||||
|
Dlg.Create(this);
|
||||||
|
Dlg.SetRange(0, FileList.GetSize());
|
||||||
|
|
||||||
|
for (int i = 0; i < FileList.GetSize(); i++)
|
||||||
|
{
|
||||||
|
char* Name = FileList[i];
|
||||||
|
char* Slash = strrchr(Name, '\\');
|
||||||
|
if (Slash > Name)
|
||||||
|
Name = Slash+1;
|
||||||
|
|
||||||
|
Slash = strrchr(Name, '/');
|
||||||
|
if (Slash > Name)
|
||||||
|
Name = Slash+1;
|
||||||
|
|
||||||
|
Dlg.SetStatus(Name);
|
||||||
|
Dlg.StepIt();
|
||||||
|
|
||||||
|
FileMem* TmpFile;
|
||||||
|
|
||||||
|
TmpFile = NewBin;
|
||||||
|
NewBin = OldBin;
|
||||||
|
OldBin = TmpFile;
|
||||||
|
NewBin->SetLength(0);
|
||||||
|
|
||||||
|
TmpFile = NewIdx;
|
||||||
|
NewIdx = OldIdx;
|
||||||
|
OldIdx = TmpFile;
|
||||||
|
NewIdx->SetLength(0);
|
||||||
|
|
||||||
|
lcGetPiecesLibrary()->ImportLDrawPiece(FileList[i], NewIdx, NewBin, OldIdx, OldBin);
|
||||||
|
|
||||||
|
if (Dlg.CheckCancelButton())
|
||||||
|
if (AfxMessageBox(IDS_CANCEL_PROMPT, MB_YESNO) == IDYES)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((!DiskIdx.Open(file1, "wb")) || (!DiskBin.Open(file2, "wb")))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
strcpy(file1, Library->GetLibraryPath());
|
||||||
|
strcat(file1, "pieces-b.old");
|
||||||
|
remove(file1);
|
||||||
|
strcpy(file2, Library->GetLibraryPath());
|
||||||
|
strcat(file2, "pieces.bin");
|
||||||
|
rename(file2, file1);
|
||||||
|
|
||||||
|
strcpy(file1, Library->GetLibraryPath());
|
||||||
|
strcat(file1, "pieces-i.old");
|
||||||
|
remove(file1);
|
||||||
|
strcpy(file2, Library->GetLibraryPath());
|
||||||
|
strcat(file2, "pieces.idx");
|
||||||
|
rename(file2, file1);
|
||||||
|
|
||||||
|
DiskBin.Seek(0, SEEK_SET);
|
||||||
|
DiskBin.Write(NewBin->GetBuffer(), NewBin->GetLength());
|
||||||
|
|
||||||
|
DiskIdx.Seek(0, SEEK_SET);
|
||||||
|
DiskIdx.Write(NewIdx->GetBuffer(), NewIdx->GetLength());
|
||||||
|
|
||||||
|
UpdateList();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
BOOL CLibraryDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
BOOL CLibraryDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||||
{
|
{
|
||||||
switch (LOWORD(wParam))
|
switch (LOWORD(wParam))
|
||||||
|
@ -198,13 +295,18 @@ BOOL CLibraryDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
if (SystemDoDialog (LC_DLG_FILE_OPEN, &opts))
|
if (SystemDoDialog (LC_DLG_FILE_OPEN, &opts))
|
||||||
{
|
{
|
||||||
|
ObjArray<String> FileList;
|
||||||
|
|
||||||
for (int i = 0; i < opts.numfiles; i++)
|
for (int i = 0; i < opts.numfiles; i++)
|
||||||
{
|
{
|
||||||
lcGetPiecesLibrary ()->ImportLDrawPiece (opts.filenames[i]);
|
FileList.Add(opts.filenames[i]);
|
||||||
free (opts.filenames[i]);
|
free (opts.filenames[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free (opts.filenames);
|
free (opts.filenames);
|
||||||
|
|
||||||
|
ImportPieces(FileList);
|
||||||
|
|
||||||
Sys_ProfileSaveString ("Default", "LDraw Pieces Path", opts.path);
|
Sys_ProfileSaveString ("Default", "LDraw Pieces Path", opts.path);
|
||||||
|
|
||||||
UpdateList();
|
UpdateList();
|
||||||
|
@ -213,6 +315,61 @@ BOOL CLibraryDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
case ID_FILE_IMPORTFOLDER:
|
||||||
|
{
|
||||||
|
LC_DLG_DIRECTORY_BROWSE_OPTS Opts;
|
||||||
|
|
||||||
|
Opts.Title = "Select Folder";
|
||||||
|
strcpy(Opts.Path, Sys_ProfileLoadString ("Default", "LDraw Pieces Path", ""));
|
||||||
|
|
||||||
|
if (!SystemDoDialog(LC_DLG_DIRECTORY_BROWSE, &Opts))
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
ObjArray<String> FileList;
|
||||||
|
|
||||||
|
WIN32_FIND_DATA FindData;
|
||||||
|
HANDLE Find = INVALID_HANDLE_VALUE;
|
||||||
|
|
||||||
|
int Len = strlen(Opts.Path);
|
||||||
|
|
||||||
|
if (Opts.Path[Len-1] != '\\' && Opts.Path[Len-1] != '/')
|
||||||
|
strcat(Opts.Path, "\\");
|
||||||
|
|
||||||
|
char Dir[MAX_PATH];
|
||||||
|
strcpy(Dir, Opts.Path);
|
||||||
|
strcat(Dir, "*.dat");
|
||||||
|
|
||||||
|
Find = FindFirstFile(Dir, &FindData);
|
||||||
|
|
||||||
|
if (Find == INVALID_HANDLE_VALUE)
|
||||||
|
{
|
||||||
|
SystemDoMessageBox("No files found.", LC_MB_OK | LC_MB_ICONERROR);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
char File[MAX_PATH];
|
||||||
|
strcpy(File, Opts.Path);
|
||||||
|
strcat(File, FindData.cFileName);
|
||||||
|
FileList.Add(File);
|
||||||
|
}
|
||||||
|
while (FindNextFile(Find, &FindData) != 0);
|
||||||
|
|
||||||
|
FindClose(Find);
|
||||||
|
|
||||||
|
lcGetPiecesLibrary()->DeleteAllPieces();
|
||||||
|
ImportPieces(FileList);
|
||||||
|
|
||||||
|
Sys_ProfileSaveString("Default", "LDraw Pieces Path", Opts.Path);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
case ID_LIBDLG_FILE_TEXTURES:
|
case ID_LIBDLG_FILE_TEXTURES:
|
||||||
{
|
{
|
||||||
CTexturesDlg dlg;
|
CTexturesDlg dlg;
|
||||||
|
@ -317,12 +474,15 @@ BOOL CLibraryDlg::OnCommand(WPARAM wParam, LPARAM lParam)
|
||||||
|
|
||||||
case ID_LIBDLG_PIECE_DELETE:
|
case ID_LIBDLG_PIECE_DELETE:
|
||||||
{
|
{
|
||||||
PtrArray<PieceInfo> Pieces;
|
PtrArray<const char> Pieces;
|
||||||
|
|
||||||
for (int i = 0; i < m_List.GetItemCount(); i++)
|
for (int i = 0; i < m_List.GetItemCount(); i++)
|
||||||
{
|
{
|
||||||
if (m_List.GetItemState(i, LVIS_SELECTED))
|
if (m_List.GetItemState(i, LVIS_SELECTED))
|
||||||
Pieces.Add((PieceInfo*)m_List.GetItemData(i));
|
{
|
||||||
|
PieceInfo* Info = (PieceInfo*)m_List.GetItemData(i);
|
||||||
|
Pieces.Add(Info->m_strName);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Pieces.GetSize() == 0)
|
if (Pieces.GetSize() == 0)
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#ifndef _LIBDLG_H_
|
#ifndef _LIBDLG_H_
|
||||||
#define _LIBDLG_H_
|
#define _LIBDLG_H_
|
||||||
|
|
||||||
|
#include "array.h"
|
||||||
|
#include "str.h"
|
||||||
|
|
||||||
class PieceInfo;
|
class PieceInfo;
|
||||||
|
|
||||||
class CLibraryDlg : public CDialog
|
class CLibraryDlg : public CDialog
|
||||||
|
@ -33,6 +36,8 @@ public:
|
||||||
void UpdateTree();
|
void UpdateTree();
|
||||||
void UpdateList();
|
void UpdateList();
|
||||||
|
|
||||||
|
bool ImportPieces(const ObjArray<String>& FileList);
|
||||||
|
|
||||||
CToolBar m_wndToolBar;
|
CToolBar m_wndToolBar;
|
||||||
CImageList m_TreeImages;
|
CImageList m_TreeImages;
|
||||||
int m_SortColumn;
|
int m_SortColumn;
|
||||||
|
|
|
@ -1315,6 +1315,47 @@ bool SystemDoDialog(int nMode, void* param)
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
|
case LC_DLG_DIRECTORY_BROWSE:
|
||||||
|
{
|
||||||
|
LC_DLG_DIRECTORY_BROWSE_OPTS* Opts = (LC_DLG_DIRECTORY_BROWSE_OPTS*)param;
|
||||||
|
|
||||||
|
strcpy(Opts->Path, "");
|
||||||
|
|
||||||
|
LPMALLOC ShellMalloc;
|
||||||
|
if (SHGetMalloc(&ShellMalloc) == NOERROR)
|
||||||
|
{
|
||||||
|
BROWSEINFO bi;
|
||||||
|
LPITEMIDLIST pidl;
|
||||||
|
|
||||||
|
if (AfxGetMainWnd())
|
||||||
|
bi.hwndOwner = AfxGetMainWnd()->GetSafeHwnd();
|
||||||
|
else
|
||||||
|
bi.hwndOwner = ::GetDesktopWindow();
|
||||||
|
bi.pidlRoot = NULL;
|
||||||
|
bi.pszDisplayName = Opts->Path;
|
||||||
|
bi.lpszTitle = Opts->Title;
|
||||||
|
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
|
||||||
|
bi.lpfn = NULL;
|
||||||
|
bi.lParam = 0;
|
||||||
|
|
||||||
|
pidl = SHBrowseForFolder(&bi);
|
||||||
|
if (pidl != NULL)
|
||||||
|
{
|
||||||
|
if (SHGetPathFromIDList(pidl, Opts->Path))
|
||||||
|
{
|
||||||
|
if (Opts->Path[strlen(Opts->Path)-1] != '\\')
|
||||||
|
strcat(Opts->Path, "\\");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
ShellMalloc->Free(pidl);
|
||||||
|
}
|
||||||
|
ShellMalloc->Release();
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
|
} break;
|
||||||
|
|
||||||
case LC_DLG_HTML:
|
case LC_DLG_HTML:
|
||||||
{
|
{
|
||||||
LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)param;
|
LC_HTMLDLG_OPTS* opts = (LC_HTMLDLG_OPTS*)param;
|
||||||
|
|
|
@ -454,7 +454,7 @@ void Export3DStudio()
|
||||||
memset(facemats, 0, sizeof(facemats));
|
memset(facemats, 0, sizeof(facemats));
|
||||||
|
|
||||||
PieceInfo* pInfo = pPiece->GetPieceInfo();
|
PieceInfo* pInfo = pPiece->GetPieceInfo();
|
||||||
if (pInfo->m_nFlags & LC_PIECE_LONGDATA)
|
if (pInfo->m_nFlags & LC_PIECE_LONGDATA_INDICES)
|
||||||
continue; // 3DS can't handle this
|
continue; // 3DS can't handle this
|
||||||
|
|
||||||
// count number of faces used
|
// count number of faces used
|
||||||
|
|
|
@ -663,6 +663,7 @@
|
||||||
#define ID_VIEW_TOOLBARS 33175
|
#define ID_VIEW_TOOLBARS 33175
|
||||||
#define ID_VIEW_SPLIT_HORIZONTALLY 33177
|
#define ID_VIEW_SPLIT_HORIZONTALLY 33177
|
||||||
#define ID_TOOLBARS_PROPERTIES 33178
|
#define ID_TOOLBARS_PROPERTIES 33178
|
||||||
|
#define ID_FILE_IMPORTFOLDER 33179
|
||||||
#define ID_VIEW_PIECES_BAR 59425
|
#define ID_VIEW_PIECES_BAR 59425
|
||||||
#define ID_VIEW_TOOLS_BAR 59426
|
#define ID_VIEW_TOOLS_BAR 59426
|
||||||
#define ID_VIEW_ANIMATION_BAR 59427
|
#define ID_VIEW_ANIMATION_BAR 59427
|
||||||
|
@ -676,7 +677,7 @@
|
||||||
#ifndef APSTUDIO_READONLY_SYMBOLS
|
#ifndef APSTUDIO_READONLY_SYMBOLS
|
||||||
#define _APS_3D_CONTROLS 1
|
#define _APS_3D_CONTROLS 1
|
||||||
#define _APS_NEXT_RESOURCE_VALUE 242
|
#define _APS_NEXT_RESOURCE_VALUE 242
|
||||||
#define _APS_NEXT_COMMAND_VALUE 33179
|
#define _APS_NEXT_COMMAND_VALUE 33180
|
||||||
#define _APS_NEXT_CONTROL_VALUE 1247
|
#define _APS_NEXT_CONTROL_VALUE 1247
|
||||||
#define _APS_NEXT_SYMED_VALUE 121
|
#define _APS_NEXT_SYMED_VALUE 121
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue