leocad/common/minifig.cpp

562 lines
14 KiB
C++
Raw Normal View History

#include "lc_global.h"
#include "lc_colors.h"
2012-05-19 03:13:05 +02:00
#include "lc_math.h"
2011-09-07 23:06:51 +02:00
#include <string.h>
#include <stdio.h>
#include "minifig.h"
#include "pieceinf.h"
#include "project.h"
#include "lc_model.h"
2012-10-02 03:23:44 +02:00
#include "lc_library.h"
2011-09-07 23:06:51 +02:00
#include "lc_application.h"
2014-04-20 03:50:41 +02:00
#include "lc_context.h"
2017-04-02 01:53:54 +02:00
#include "lc_scene.h"
#include "lc_file.h"
2011-09-07 23:06:51 +02:00
2016-08-01 05:44:15 +02:00
MinifigWizard::MinifigWizard()
2011-09-07 23:06:51 +02:00
{
lcDiskFile DiskSettings(lcGetPiecesLibrary()->mLibraryDir.absoluteFilePath(QLatin1String("mlcad.ini")));
2011-09-07 23:06:51 +02:00
if (DiskSettings.Open(QIODevice::ReadOnly))
2011-09-07 23:06:51 +02:00
ParseSettings(DiskSettings);
else
{
2015-10-22 16:59:42 +02:00
QResource Resource(":/resources/minifig.ini");
if (Resource.isValid())
{
QByteArray Data;
if (Resource.isCompressed())
Data = qUncompress(Resource.data(), Resource.size());
else
Data = QByteArray::fromRawData((const char*)Resource.data(), Resource.size());
lcMemFile MemSettings;
MemSettings.WriteBuffer(Data.constData(), Data.size());
ParseSettings(MemSettings);
}
2011-09-07 23:06:51 +02:00
}
2016-08-01 05:44:15 +02:00
mRotateX = 75.0f;
mRotateZ = 180.0f;
mDistance = 10.0f;
mAutoZoom = true;
mTracking = LC_TRACK_NONE;
2011-09-07 23:06:51 +02:00
}
void MinifigWizard::OnInitialUpdate()
{
MakeCurrent();
2014-04-20 03:50:41 +02:00
mContext->SetDefaultState();
2016-08-01 05:44:15 +02:00
memset(&mMinifig, 0, sizeof(lcMinifig));
2013-08-09 06:57:18 +02:00
const int ColorCodes[LC_MFW_NUMITEMS] = { 4, 7, 14, 7, 1, 0, 7, 4, 4, 14, 14, 7, 7, 0, 0, 7, 7 };
const char* Pieces[LC_MFW_NUMITEMS] = { "3624.dat", "", "3626bp01.dat", "", "973.dat", "3815.dat", "", "3819.dat", "3818.dat", "3820.dat", "3820.dat", "", "", "3817.dat", "3816.dat", "", "" };
2017-01-23 04:28:05 +01:00
lcPiecesLibrary* Library = lcGetPiecesLibrary();
for (int i = 0; i < LC_MFW_NUMITEMS; i++)
{
2016-08-01 05:44:15 +02:00
mMinifig.Colors[i] = lcGetColorIndex(ColorCodes[i]);
PieceInfo* Info = Library->FindPiece(Pieces[i], nullptr, false, false);
2013-08-09 06:57:18 +02:00
if (Info)
{
2016-08-01 05:44:15 +02:00
mMinifig.Parts[i] = Info;
2017-01-23 04:28:05 +01:00
Library->LoadPieceInfo(Info, false, true);
2013-08-09 06:57:18 +02:00
}
}
2017-01-23 04:28:05 +01:00
Library->WaitForLoadQueue();
Calculate();
}
MinifigWizard::~MinifigWizard()
2011-09-07 23:06:51 +02:00
{
2017-01-23 04:28:05 +01:00
lcPiecesLibrary* Library = lcGetPiecesLibrary();
2013-08-09 06:57:18 +02:00
for (int i = 0; i < LC_MFW_NUMITEMS; i++)
2016-08-01 05:44:15 +02:00
if (mMinifig.Parts[i])
2017-01-23 04:28:05 +01:00
Library->ReleasePieceInfo(mMinifig.Parts[i]);
2011-09-07 23:06:51 +02:00
}
2012-03-23 00:44:56 +01:00
void MinifigWizard::ParseSettings(lcFile& Settings)
2011-09-07 23:06:51 +02:00
{
const char* SectionNames[LC_MFW_NUMITEMS] =
{
"[HATS]", // LC_MFW_HATS
"[HATS2]", // LC_MFW_HATS2
"[HEAD]", // LC_MFW_HEAD
"[NECK]", // LC_MFW_NECK
"[BODY]", // LC_MFW_BODY
"[BODY2]", // LC_MFW_BODY2
"[BODY3]", // LC_MFW_BODY3
"[RARM]", // LC_MFW_RARM
"[LARM]", // LC_MFW_LARM
"[RHAND]", // LC_MFW_RHAND
"[LHAND]", // LC_MFW_LHAND
"[RHANDA]", // LC_MFW_RHANDA
"[LHANDA]", // LC_MFW_LHANDA
"[RLEG]", // LC_MFW_RLEG
"[LLEG]", // LC_MFW_LLEG
"[RLEGA]", // LC_MFW_RLEGA
"[LLEGA]", // LC_MFW_LLEGA
2011-09-07 23:06:51 +02:00
};
for (int SectionIndex = 0; SectionIndex < LC_MFW_NUMITEMS; SectionIndex++)
{
2013-08-16 01:43:18 +02:00
lcArray<lcMinifigPieceInfo>& InfoArray = mSettings[SectionIndex];
2011-09-07 23:06:51 +02:00
InfoArray.RemoveAll();
Settings.Seek(0, SEEK_SET);
char Line[1024];
bool FoundSection = false;
const char* SectionName = SectionNames[SectionIndex];
2016-02-17 00:11:52 +01:00
size_t SectionNameLength = strlen(SectionName);
2011-09-07 23:06:51 +02:00
// Find start of section
while (Settings.ReadLine(Line, sizeof(Line)))
{
if (!strncmp(Line, SectionName, SectionNameLength))
{
FoundSection = true;
break;
}
}
if (!FoundSection)
2012-07-21 02:31:21 +02:00
{
lcMinifigPieceInfo MinifigInfo;
strncpy(MinifigInfo.Description, "None", sizeof(MinifigInfo.Description));
MinifigInfo.Description[sizeof(MinifigInfo.Description)-1] = 0;
MinifigInfo.Offset = lcMatrix44Identity();
MinifigInfo.Info = nullptr;
2012-07-21 02:31:21 +02:00
InfoArray.Add(MinifigInfo);
2011-09-07 23:06:51 +02:00
continue;
2012-07-21 02:31:21 +02:00
}
2011-09-07 23:06:51 +02:00
// Parse section.
while (Settings.ReadLine(Line, sizeof(Line)))
{
if (Line[0] == '[')
break;
char* DescriptionStart = strchr(Line, '"');
if (!DescriptionStart)
continue;
DescriptionStart++;
char* DescriptionEnd = strchr(DescriptionStart, '"');
if (!DescriptionEnd)
continue;
*DescriptionEnd = 0;
DescriptionEnd++;
char* NameStart = strchr(DescriptionEnd, '"');
if (!NameStart)
continue;
NameStart++;
char* NameEnd = strchr(NameStart, '"');
if (!NameEnd)
continue;
*NameEnd = 0;
NameEnd++;
PieceInfo* Info = lcGetPiecesLibrary()->FindPiece(NameStart, nullptr, false, false);
2011-09-07 23:06:51 +02:00
if (!Info && *NameStart)
continue;
float Mat[12];
int Flags;
if (sscanf(NameEnd, "%d %g %g %g %g %g %g %g %g %g %g %g %g",
&Flags, &Mat[0], &Mat[1], &Mat[2], &Mat[3], &Mat[4], &Mat[5], &Mat[6],
&Mat[7], &Mat[8], &Mat[9], &Mat[10], &Mat[11]) != 13)
continue;
2012-05-19 03:13:05 +02:00
lcMatrix44 Offset = lcMatrix44Identity();
2011-09-07 23:06:51 +02:00
float* OffsetMatrix = &Offset[0][0];
OffsetMatrix[0] = Mat[0];
OffsetMatrix[8] = -Mat[1];
OffsetMatrix[4] = Mat[2];
OffsetMatrix[2] = -Mat[3];
OffsetMatrix[10] = Mat[4];
OffsetMatrix[6] = -Mat[5];
OffsetMatrix[1] = Mat[6];
OffsetMatrix[9] = -Mat[7];
OffsetMatrix[5] = Mat[8];
2014-08-30 21:48:36 +02:00
OffsetMatrix[12] = Mat[9];
OffsetMatrix[14] = -Mat[10];
OffsetMatrix[13] = Mat[11];
2011-09-07 23:06:51 +02:00
lcMinifigPieceInfo MinifigInfo;
strncpy(MinifigInfo.Description, DescriptionStart, sizeof(MinifigInfo.Description));
MinifigInfo.Description[sizeof(MinifigInfo.Description)-1] = 0;
MinifigInfo.Offset = Offset;
MinifigInfo.Info = Info;
InfoArray.Add(MinifigInfo);
}
}
}
2012-02-01 03:07:54 +01:00
void MinifigWizard::OnDraw()
2011-09-07 23:06:51 +02:00
{
mContext->SetDefaultState();
2013-08-09 06:57:18 +02:00
float Aspect = (float)mWidth/(float)mHeight;
mContext->SetViewport(0, 0, mWidth, mHeight);
lcGetActiveModel()->DrawBackground(this);
2016-02-19 18:53:54 +01:00
lcVector3 Min(FLT_MAX, FLT_MAX, FLT_MAX), Max(-FLT_MAX, -FLT_MAX, -FLT_MAX);
for (int InfoIdx = 0; InfoIdx < LC_MFW_NUMITEMS; InfoIdx++)
{
2016-08-01 05:44:15 +02:00
PieceInfo* Info = mMinifig.Parts[InfoIdx];
if (!Info)
continue;
2016-02-19 18:53:54 +01:00
lcVector3 Points[8];
lcGetBoxCorners(Info->GetBoundingBox(), Points);
for (int PointIdx = 0; PointIdx < 8; PointIdx++)
{
2016-08-01 05:44:15 +02:00
lcVector3 Point = lcMul31(Points[PointIdx], mMinifig.Matrices[InfoIdx]);
2016-02-19 18:53:54 +01:00
Min = lcMin(Point, Min);
Max = lcMax(Point, Max);
}
}
2016-02-19 18:53:54 +01:00
lcVector3 Center = (Min + Max) / 2.0f;
lcVector3 Eye(0.0f, 0.0f, 1.0f);
2016-08-01 05:44:15 +02:00
Eye = lcMul30(Eye, lcMatrix44RotationX(-mRotateX * LC_DTOR));
Eye = lcMul30(Eye, lcMatrix44RotationZ(-mRotateZ * LC_DTOR));
2014-08-30 21:48:36 +02:00
lcMatrix44 Projection = lcMatrix44Perspective(30.0f, Aspect, 1.0f, 2500.0f);
2014-04-20 03:50:41 +02:00
mContext->SetProjectionMatrix(Projection);
2014-02-16 08:23:55 +01:00
lcMatrix44 ViewMatrix;
2016-08-01 05:44:15 +02:00
if (mAutoZoom)
{
2016-02-19 18:53:54 +01:00
lcVector3 Points[8];
lcGetBoxCorners(Min, Max, Points);
Eye += Center;
lcMatrix44 ModelView = lcMatrix44LookAt(Eye, Center, lcVector3(0, 0, 1));
std::tie(Eye, std::ignore) = lcZoomExtents(Eye, ModelView, Projection, Points, 8);
2014-02-16 08:23:55 +01:00
ViewMatrix = lcMatrix44LookAt(Eye, Center, lcVector3(0, 0, 1));
lcVector3 d = Eye - Center;
2016-08-01 05:44:15 +02:00
mDistance = d.Length();
}
else
{
2016-08-01 05:44:15 +02:00
ViewMatrix = lcMatrix44LookAt(Eye * mDistance, Center, lcVector3(0, 0, 1));
}
2012-02-01 03:07:54 +01:00
Calculate();
2011-09-07 23:06:51 +02:00
2015-02-08 19:54:51 +01:00
lcScene Scene;
Scene.Begin(ViewMatrix);
2014-04-23 16:53:43 +02:00
for (int PieceIdx = 0; PieceIdx < LC_MFW_NUMITEMS; PieceIdx++)
2016-08-01 05:44:15 +02:00
if (mMinifig.Parts[PieceIdx])
mMinifig.Parts[PieceIdx]->AddRenderMeshes(Scene, mMinifig.Matrices[PieceIdx], mMinifig.Colors[PieceIdx], false, false, false);
2011-09-07 23:06:51 +02:00
2015-02-08 19:54:51 +01:00
Scene.End();
2014-04-23 16:53:43 +02:00
2017-04-02 01:53:54 +02:00
Scene.Draw(mContext);
2015-02-08 19:54:51 +01:00
2017-03-25 20:29:28 +01:00
mContext->ClearResources();
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnLeftButtonDown()
{
2016-08-01 05:44:15 +02:00
if (mTracking == LC_TRACK_NONE)
{
2016-08-01 05:44:15 +02:00
mDownX = mInputState.x;
mDownY = mInputState.y;
mTracking = LC_TRACK_LEFT;
}
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnLeftButtonUp()
{
2016-08-01 05:44:15 +02:00
if (mTracking == LC_TRACK_LEFT)
mTracking = LC_TRACK_NONE;
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnLeftButtonDoubleClick()
{
2016-08-01 05:44:15 +02:00
mAutoZoom = true;
Redraw();
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnRightButtonDown()
{
2016-08-01 05:44:15 +02:00
if (mTracking == LC_TRACK_NONE)
{
2016-08-01 05:44:15 +02:00
mDownX = mInputState.x;
mDownY = mInputState.y;
mTracking = LC_TRACK_RIGHT;
}
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnRightButtonUp()
{
2016-08-01 05:44:15 +02:00
if (mTracking == LC_TRACK_RIGHT)
mTracking = LC_TRACK_NONE;
}
2013-08-09 06:57:18 +02:00
void MinifigWizard::OnMouseMove()
{
2016-08-01 05:44:15 +02:00
if (mTracking == LC_TRACK_LEFT)
{
// Rotate.
2016-08-01 05:44:15 +02:00
mRotateZ += mInputState.x - mDownX;
mRotateX += mInputState.y - mDownY;
2016-08-01 05:44:15 +02:00
if (mRotateX > 179.5f)
mRotateX = 179.5f;
else if (mRotateX < 0.5f)
mRotateX = 0.5f;
2016-08-01 05:44:15 +02:00
mDownX = mInputState.x;
mDownY = mInputState.y;
Redraw();
}
2016-08-01 05:44:15 +02:00
else if (mTracking == LC_TRACK_RIGHT)
{
// Zoom.
2016-08-01 05:44:15 +02:00
mDistance += (float)(mDownY - mInputState.y) * 0.2f;
mAutoZoom = false;
2016-08-01 05:44:15 +02:00
if (mDistance < 0.5f)
mDistance = 0.5f;
2016-08-01 05:44:15 +02:00
mDownX = mInputState.x;
mDownY = mInputState.y;
Redraw();
}
}
2011-09-07 23:06:51 +02:00
void MinifigWizard::Calculate()
{
float HeadOffset = 0.0f;
2012-05-19 03:13:05 +02:00
lcMatrix44 Root, Mat, Mat2;
2011-09-07 23:06:51 +02:00
2016-08-01 05:44:15 +02:00
PieceInfo** Parts = mMinifig.Parts;
float* Angles = mMinifig.Angles;
lcMatrix44* Matrices = mMinifig.Matrices;
2012-02-01 03:07:54 +01:00
2017-07-27 19:02:07 +02:00
bool DroidTorso = Parts[LC_MFW_BODY] && !qstricmp(Parts[LC_MFW_BODY]->mFileName, "30375.dat");
bool SkeletonTorso = Parts[LC_MFW_BODY] && !qstricmp(Parts[LC_MFW_BODY]->mFileName, "6260.dat");
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_BODY3])
2014-08-30 21:48:36 +02:00
Root = lcMatrix44Translation(lcVector3(0, 0, 74.0f));
else
2014-08-30 21:48:36 +02:00
Root = lcMatrix44Translation(lcVector3(0, 0, 72.0f));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_BODY] = lcMul(mSettings[LC_MFW_BODY][GetSelectionIndex(LC_MFW_BODY)].Offset, Root);
2011-09-07 23:06:51 +02:00
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_NECK])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_NECK] = lcMul(mSettings[LC_MFW_NECK][GetSelectionIndex(LC_MFW_NECK)].Offset, Root);
2011-09-07 23:06:51 +02:00
HeadOffset = 0.08f;
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_HEAD])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(-LC_DTOR * Angles[LC_MFW_HEAD]);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0.0f, 0.0f, 24.0f + HeadOffset));
2012-05-19 03:13:05 +02:00
Mat = lcMul(mSettings[LC_MFW_HEAD][GetSelectionIndex(LC_MFW_HEAD)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_HEAD] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_HATS])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(-LC_DTOR * Angles[LC_MFW_HATS]);
Mat = lcMul(mSettings[LC_MFW_HATS][GetSelectionIndex(LC_MFW_HATS)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_HATS] = lcMul(Mat, Matrices[LC_MFW_HEAD]);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_HATS2])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationX(-LC_DTOR * Angles[LC_MFW_HATS2]);
Mat = lcMul(mSettings[LC_MFW_HATS2][GetSelectionIndex(LC_MFW_HATS2)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_HATS2] = lcMul(Mat, Matrices[LC_MFW_HATS]);
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_RARM])
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationX(-LC_DTOR * Angles[LC_MFW_RARM]);
2011-09-07 23:06:51 +02:00
2012-02-01 03:07:54 +01:00
if (DroidTorso || SkeletonTorso)
2012-05-19 03:13:05 +02:00
Mat2 = lcMatrix44Identity();
2011-09-07 23:06:51 +02:00
else
Mat2 = lcMatrix44RotationY(-LC_DTOR * 9.791f);
2014-08-30 21:48:36 +02:00
Mat2.SetTranslation(lcVector3(15.5f, 0, -8.0f));
2011-09-07 23:06:51 +02:00
Mat = lcMul(mSettings[LC_MFW_RARM][GetSelectionIndex(LC_MFW_RARM)].Offset, Mat);
2012-05-19 03:13:05 +02:00
Mat = lcMul(Mat, Mat2);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_RARM] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_RHAND])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationY(-LC_DTOR * Angles[LC_MFW_RHAND]);
2012-05-19 03:13:05 +02:00
Mat2 = lcMatrix44RotationX(LC_DTOR * 45);
Mat = lcMul(mSettings[LC_MFW_RHAND][GetSelectionIndex(LC_MFW_RHAND)].Offset, Mat);
2012-05-19 03:13:05 +02:00
Mat = lcMul(Mat, Mat2);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(5.0f, -10.0f, -19.0f));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_RHAND] = lcMul(Mat, Matrices[LC_MFW_RARM]);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_RHANDA])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(LC_DTOR * Angles[LC_MFW_RHANDA]);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, -10.0f, 0));
Mat = lcMul(mSettings[LC_MFW_RHANDA][GetSelectionIndex(LC_MFW_RHANDA)].Offset, Mat);
Mat = lcMul(Mat, lcMatrix44RotationX(LC_DTOR * 15.0f));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_RHANDA] = lcMul(Mat, Matrices[LC_MFW_RHAND]);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_LARM])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationX(-LC_DTOR * Angles[LC_MFW_LARM]);
2011-09-07 23:06:51 +02:00
2012-02-01 03:07:54 +01:00
if (DroidTorso || SkeletonTorso)
2012-05-19 03:13:05 +02:00
Mat2 = lcMatrix44Identity();
2011-09-07 23:06:51 +02:00
else
Mat2 = lcMatrix44RotationY(LC_DTOR * 9.791f);
2014-08-30 21:48:36 +02:00
Mat2.SetTranslation(lcVector3(-15.5f, 0.0f, -8.0f));
2011-09-07 23:06:51 +02:00
Mat = lcMul(mSettings[LC_MFW_LARM][GetSelectionIndex(LC_MFW_LARM)].Offset, Mat);
2012-05-19 03:13:05 +02:00
Mat = lcMul(Mat, Mat2);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_LARM] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_LHAND])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationY(-LC_DTOR * Angles[LC_MFW_LHAND]);
2012-05-19 03:13:05 +02:00
Mat2 = lcMatrix44RotationX(LC_DTOR * 45);
Mat = lcMul(mSettings[LC_MFW_LHAND][GetSelectionIndex(LC_MFW_LHAND)].Offset, Mat);
2012-05-19 03:13:05 +02:00
Mat = lcMul(Mat, Mat2);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(-5.0f, -10.0f, -19.0f));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_LHAND] = lcMul(Mat, Matrices[LC_MFW_LARM]);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_LHANDA])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(LC_DTOR * Angles[LC_MFW_LHANDA]);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, -10.0f, 0));
Mat = lcMul(mSettings[LC_MFW_LHANDA][GetSelectionIndex(LC_MFW_LHANDA)].Offset, Mat);
Mat = lcMul(Mat, lcMatrix44RotationX(LC_DTOR * 15.0f));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_LHANDA] = lcMul(Mat, Matrices[LC_MFW_LHAND]);
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_BODY2])
{
Mat = lcMatrix44Identity();
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, 0, -32.0f));
Mat = lcMul(mSettings[LC_MFW_BODY2][GetSelectionIndex(LC_MFW_BODY2)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_BODY2] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_BODY3])
2011-09-07 23:06:51 +02:00
{
2012-05-19 03:13:05 +02:00
Mat = lcMatrix44Identity();
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, 0, -32.0f));
Mat = lcMul(mSettings[LC_MFW_BODY3][GetSelectionIndex(LC_MFW_BODY3)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_BODY3] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_RLEG])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationX(-LC_DTOR * Angles[LC_MFW_RLEG]);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, 0, -44.0f));
Mat = lcMul(mSettings[LC_MFW_RLEG][GetSelectionIndex(LC_MFW_RLEG)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_RLEG] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_RLEGA])
2011-09-07 23:06:51 +02:00
{
2014-08-30 21:48:36 +02:00
lcVector3 Center(-10.0f, -1.0f, -28.0f);
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(LC_DTOR * Angles[LC_MFW_RLEGA]);
Mat2 = mSettings[LC_MFW_RLEGA][GetSelectionIndex(LC_MFW_RLEGA)].Offset;
2012-05-19 03:13:05 +02:00
Mat2.SetTranslation(lcMul31(-Center, Mat2));
Mat = lcMul(Mat2, Mat);
Mat.SetTranslation(lcMul31(Center, Mat2));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_RLEGA] = lcMul(Mat, Matrices[LC_MFW_RLEG]);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_LLEG])
2011-09-07 23:06:51 +02:00
{
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationX(-LC_DTOR * Angles[LC_MFW_LLEG]);
2014-08-30 21:48:36 +02:00
Mat.SetTranslation(lcVector3(0, 0, -44.0f));
Mat = lcMul(mSettings[LC_MFW_LLEG][GetSelectionIndex(LC_MFW_LLEG)].Offset, Mat);
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_LLEG] = lcMul(Mat, Root);
2011-09-07 23:06:51 +02:00
}
2013-08-09 06:57:18 +02:00
if (Parts[LC_MFW_LLEGA])
2011-09-07 23:06:51 +02:00
{
2014-08-30 21:48:36 +02:00
lcVector3 Center(10.0f, -1.0f, -28.0f);
2013-08-09 06:57:18 +02:00
Mat = lcMatrix44RotationZ(LC_DTOR * Angles[LC_MFW_LLEGA]);
Mat2 = mSettings[LC_MFW_LLEGA][GetSelectionIndex(LC_MFW_LLEGA)].Offset;
2012-05-19 03:13:05 +02:00
Mat2.SetTranslation(lcMul31(-Center, Mat2));
Mat = lcMul(Mat2, Mat);
Mat.SetTranslation(lcMul31(Center, Mat2));
2013-08-09 06:57:18 +02:00
Matrices[LC_MFW_LLEGA] = lcMul(Mat, Matrices[LC_MFW_LLEG]);
2011-09-07 23:06:51 +02:00
}
}
int MinifigWizard::GetSelectionIndex(int Type) const
{
2013-08-16 01:43:18 +02:00
const lcArray<lcMinifigPieceInfo>& InfoArray = mSettings[Type];
2011-09-07 23:06:51 +02:00
for (int Index = 0; Index < InfoArray.GetSize(); Index++)
2016-08-01 05:44:15 +02:00
if (InfoArray[Index].Info == mMinifig.Parts[Type])
2011-09-07 23:06:51 +02:00
return Index;
return 0;
}
void MinifigWizard::SetSelectionIndex(int Type, int Index)
{
2017-01-23 04:28:05 +01:00
lcPiecesLibrary* Library = lcGetPiecesLibrary();
MakeCurrent();
2016-08-01 05:44:15 +02:00
if (mMinifig.Parts[Type])
2017-01-23 04:28:05 +01:00
Library->ReleasePieceInfo(mMinifig.Parts[Type]);
2011-09-07 23:06:51 +02:00
2016-08-01 05:44:15 +02:00
mMinifig.Parts[Type] = mSettings[Type][Index].Info;
2011-09-07 23:06:51 +02:00
2016-08-01 05:44:15 +02:00
if (mMinifig.Parts[Type])
2017-01-23 04:28:05 +01:00
Library->LoadPieceInfo(mMinifig.Parts[Type], true, true);
2011-09-07 23:06:51 +02:00
Calculate();
}
void MinifigWizard::SetColor(int Type, int Color)
{
2016-08-01 05:44:15 +02:00
mMinifig.Colors[Type] = Color;
2011-09-07 23:06:51 +02:00
}
void MinifigWizard::SetAngle(int Type, float Angle)
{
2016-08-01 05:44:15 +02:00
mMinifig.Angles[Type] = Angle;
2011-09-07 23:06:51 +02:00
}