mirror of
https://github.com/leozide/leocad
synced 2025-02-07 08:45:49 +01:00
Match cylindrical texmap to spherical.
This commit is contained in:
parent
2ac187d95c
commit
e2fdf6ca03
1 changed files with 20 additions and 19 deletions
|
@ -37,22 +37,22 @@ static lcVector2 lcCalculateTexCoord(const lcVector3& Position, const lcLibraryT
|
||||||
|
|
||||||
case lcLibraryTextureMapType::CYLINDRICAL:
|
case lcLibraryTextureMapType::CYLINDRICAL:
|
||||||
{
|
{
|
||||||
const lcVector3& Up = (lcVector3&)TextureMap->Params[0];
|
const lcVector4& FrontPlane = TextureMap->Params[0];
|
||||||
const lcVector3& Front = (lcVector3&)TextureMap->Params[1];
|
const lcVector3& Center = (const lcVector3&)TextureMap->Params[1];
|
||||||
const lcVector3& Base = (lcVector3&)TextureMap->Params[2];
|
const lcVector4& Plane1 = TextureMap->Params[2];
|
||||||
|
const lcVector4& Plane2 = TextureMap->Params[3];
|
||||||
lcVector2 TexCoord;
|
lcVector2 TexCoord;
|
||||||
|
|
||||||
lcVector3 VertexDir = Position - Base;
|
float DotPlane1 = lcDot(lcVector4(Position, 1.0f), Plane1);
|
||||||
|
lcVector3 PointInPlane1 = Position - lcVector3(Plane1) * DotPlane1;
|
||||||
|
float DotFrontPlane = lcDot(lcVector4(PointInPlane1, 1.0f), FrontPlane);
|
||||||
|
float DotPlane2 = lcDot(lcVector4(PointInPlane1, 1.0f), Plane2);
|
||||||
|
|
||||||
TexCoord.y = (lcDot(VertexDir, Up)) / TextureMap->Params[0].w;
|
float Angle1 = atan2f(DotPlane2, DotFrontPlane) / LC_PI * TextureMap->Angle1;
|
||||||
|
TexCoord.x = 0.5f + 0.5f * Angle1;
|
||||||
|
|
||||||
lcVector3 VertexDirPlane = lcNormalize(VertexDir - (Up * TexCoord.y));
|
lcVector3 VertexDir = Position - Center;
|
||||||
float Angle = acos(lcDot(Front, VertexDirPlane));
|
TexCoord.y = (lcDot(VertexDir, lcVector3(Plane1))) / TextureMap->Params[1].w;
|
||||||
|
|
||||||
if (lcDot(TextureMap->Params[3], lcVector4(Position, 1.0f)) > 0.0f)
|
|
||||||
TexCoord.x = 0.5f + 0.5f * Angle / TextureMap->Angle1;
|
|
||||||
else
|
|
||||||
TexCoord.x = 0.5f - 0.5f * Angle / TextureMap->Angle1;
|
|
||||||
|
|
||||||
return TexCoord;
|
return TexCoord;
|
||||||
}
|
}
|
||||||
|
@ -2014,17 +2014,18 @@ bool lcPiecesLibrary::ReadMeshData(lcFile& File, const lcMatrix44& CurrentTransf
|
||||||
Map.Next = false;
|
Map.Next = false;
|
||||||
Map.Fallback = false;
|
Map.Fallback = false;
|
||||||
Map.Texture = FindTexture(FileName, CurrentProject, SearchProjectFolder);
|
Map.Texture = FindTexture(FileName, CurrentProject, SearchProjectFolder);
|
||||||
Map.Type = lcLibraryTextureMapType::CYLINDRICAL;
|
|
||||||
|
|
||||||
|
Map.Type = lcLibraryTextureMapType::CYLINDRICAL;
|
||||||
lcVector3 Up = Points[0] - Points[1];
|
lcVector3 Up = Points[0] - Points[1];
|
||||||
float UpLength = lcLength(Up);
|
float UpLength = lcLength(Up);
|
||||||
lcVector3 Front = lcNormalize(Points[2] - Points[1]);
|
lcVector3 Front = lcNormalize(Points[2] - Points[1]);
|
||||||
lcVector3 PlaneNormal = lcCross(Up, Front);
|
lcVector3 Plane1Normal = Up / UpLength;
|
||||||
Map.Params[0] = lcVector4(Up / UpLength, UpLength);
|
lcVector3 Plane2Normal = lcNormalize(lcCross(Up, Front));
|
||||||
Map.Params[1] = lcVector4(Front, 0.0f);
|
Map.Params[0] = lcVector4(Front, -lcDot(Front, Points[1]));
|
||||||
Map.Params[2] = lcVector4(Points[1], 0.0f);
|
Map.Params[1] = lcVector4(Points[1], UpLength);
|
||||||
Map.Params[3] = lcVector4(PlaneNormal, -lcDot(PlaneNormal, Points[0]));
|
Map.Params[2] = lcVector4(Plane1Normal, -lcDot(Plane1Normal, Points[1]));
|
||||||
Map.Angle1 = Angle * LC_DTOR;
|
Map.Params[3] = lcVector4(Plane2Normal, -lcDot(Plane2Normal, Points[1]));
|
||||||
|
Map.Angle1 = 360.0f / Angle;
|
||||||
}
|
}
|
||||||
else if (!strcmp(Token, "SPHERICAL"))
|
else if (!strcmp(Token, "SPHERICAL"))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Reference in a new issue