2 #include "AutoUVBaseType.h"
6 SAutoUVTri::SAutoUVTri(Vec2
&a
, Vec2
&b
, Vec2
&c
, Vec3
&ap
, Vec3
&bp
, Vec3
&cp
, SAutoUVVertex
*va
, SAutoUVVertex
*vb
, SAutoUVVertex
*vc
)
19 SAutoUVSquare::SAutoUVSquare(int _w
, int _h
, float _mx
, float _my
, int polyStart
, int polyEnd
)
29 bool SAutoUVSquare::operator <(const SAutoUVSquare
&rhs
) const
32 int areaRHS
=rhs
.w
*rhs
.h
;
36 void SAutoUVSquare::Rotate()
43 void SAutoUVSquare::RotateTris(std::vector
<SAutoUVTri
> &tris
)
45 float newMx
=(tris
.begin()+s
)->v
[0].x
;
46 float newMy
=(tris
.begin()+s
)->v
[0].y
;
47 for (std::vector
<SAutoUVTri
>::iterator tit
=tris
.begin()+s
, tend
=tris
.begin()+e
; tit
!=tend
; ++tit
)
49 tit
->v
[0]=tit
->v
[0].rot90cw();
50 tit
->v
[1]=tit
->v
[1].rot90cw();
51 tit
->v
[2]=tit
->v
[2].rot90cw();
52 if (tit
->v
[0].y
<newMy
)
54 if (tit
->v
[1].y
<newMy
)
56 if (tit
->v
[2].y
<newMy
)
58 if (tit
->v
[0].x
<newMx
)
60 if (tit
->v
[1].x
<newMx
)
62 if (tit
->v
[2].x
<newMx
)
69 SAutoUVExpandingRasteriser::SAutoUVExpandingRasteriser(float resolution
)
71 m_min
[0]=m_min
[1]=m_max
[0]=m_max
[1]=0;
72 m_resolution
=1.0f
/resolution
;
77 SAutoUVExpandingRasteriser::~SAutoUVExpandingRasteriser()
83 void SAutoUVExpandingRasteriser::ExpandToFitVertices(int bbMin
[2], int bbMax
[2])
85 if (bbMin
[0]<m_min
[0] || bbMin
[1]<m_min
[1] || bbMax
[0]>m_max
[0] || bbMax
[1]>m_max
[1])
87 int newMin
[2], newMax
[2];
90 m_min
[0]=m_max
[0]=bbMin
[0];
91 m_min
[1]=m_max
[1]=bbMin
[1];
94 newMin
[0]=min(bbMin
[0],m_min
[0]);
95 newMin
[1]=min(bbMin
[1],m_min
[1]);
96 newMax
[0]=max(bbMax
[0],m_max
[0]);
97 newMax
[1]=max(bbMax
[1],m_max
[1]);
98 int newSize
=(newMax
[0]-newMin
[0])*(newMax
[1]-newMin
[1]);
99 char *newPixels
=(char*)malloc(newSize
);
100 memset(newPixels
, 0, newSize
);
101 for (int y
=0; y
<newMax
[1]-newMin
[1]; y
++)
103 if (y
>=m_min
[1]-newMin
[1] && y
<m_max
[1]-newMin
[1])
104 memcpy(&newPixels
[y
*(newMax
[0]-newMin
[0])+m_min
[0]-newMin
[0]], &m_pixels
[(y
-(m_min
[1]-newMin
[1]))*(m_max
[0]-m_min
[0])], m_max
[0]-m_min
[0]);
116 bool SAutoUVExpandingRasteriser::RayTest(Vec2
&a
, Vec2
&b
, Vec2 c
, int x
, int y
)
118 Vec2
p(x
/m_resolution
, y
/m_resolution
);
119 if ((b
.x
-a
.x
)*(p
.y
-a
.y
)-(b
.y
-a
.y
)*(p
.x
-a
.x
)<0.0f
)
121 if ((c
.x
-b
.x
)*(p
.y
-b
.y
)-(c
.y
-b
.y
)*(p
.x
-b
.x
)<0.0f
)
123 if ((a
.x
-c
.x
)*(p
.y
-c
.y
)-(a
.y
-c
.y
)*(p
.x
-c
.x
)<0.0f
)
128 bool SAutoUVExpandingRasteriser::RasteriseTriangle(Vec2
&a
, Vec2
&b
, Vec2
&c
, bool bWrite
)
133 bbMin
[0]=(int)floorf(a
.x
*m_resolution
);
134 bbMin
[1]=(int)floorf(a
.y
*m_resolution
);
135 bbMax
[0]=(int)ceilf(a
.x
*m_resolution
);
136 bbMax
[1]=(int)ceilf(a
.y
*m_resolution
);
137 for (int i
=0; i
<2; i
++)
139 Vec2
*v
=(i
==0)?&b
:&c
;
140 bbMin
[0]=min(bbMin
[0], (int)floorf(v
->x
*m_resolution
));
141 bbMin
[1]=min(bbMin
[1], (int)floorf(v
->y
*m_resolution
));
142 bbMax
[0]=max(bbMax
[0], (int)ceilf(v
->x
*m_resolution
));
143 bbMax
[1]=max(bbMax
[1], (int)ceilf(v
->y
*m_resolution
));
147 ExpandToFitVertices(bbMin
, bbMax
);
149 bbMin
[0]=max(m_min
[0], bbMin
[0]);
150 bbMin
[1]=max(m_min
[1], bbMin
[1]);
151 bbMax
[0]=min(m_max
[0], bbMax
[0]);
152 bbMax
[1]=min(m_max
[1], bbMax
[1]);
154 for (int y
=bbMin
[1]; y
<bbMax
[1]; y
++)
156 for (int x
=bbMin
[0]; x
<bbMax
[0]; x
++)
158 if (RayTest(a
,b
,c
,x
,y
))
160 char *pix
=&m_pixels
[(y
-m_min
[1])*(m_max
[0]-m_min
[0])+x
-m_min
[0]];
169 return ret
?true:false;