18 mGeometryOutdated(false),
21 mCurrentColour(0xFFFFFFFF),
31 mGeometryOutdated =
true;
40 mGeometryOutdated =
true;
57 mGeometryOutdated =
true;
66 mCurrentColour = (mCurrentColour & 0x00FFFFFF) | (alpha & 0xFF000000);
74 mGeometryOutdated =
true;
83 bool need_update =
true;
137 mGeometryOutdated =
true;
139 if (
nullptr != mNode)
145 MYGUI_ASSERT(!mRenderItem,
"mRenderItem must be nullptr");
149 mRenderItem->
addDrawItem(
this, (GEOMETRY_VERTICIES_TOTAL_COUNT - 2) * 3);
154 MYGUI_ASSERT(mRenderItem,
"mRenderItem must be not nullptr");
158 mRenderItem =
nullptr;
170 if (mGeometryOutdated)
173 mGeometryOutdated =
false;
176 for (
int i = 1; i < GEOMETRY_VERTICIES_TOTAL_COUNT - 1; ++i)
178 verticies[3 * i - 3].
set(mResultVerticiesPos[0].left, mResultVerticiesPos[0].top, vertex_z, mResultVerticiesUV[0].left, mResultVerticiesUV[0].top, mCurrentColour);
179 verticies[3 * i - 2].
set(mResultVerticiesPos[i].left, mResultVerticiesPos[i].top, vertex_z, mResultVerticiesUV[i].left, mResultVerticiesUV[i].top, mCurrentColour);
180 verticies[3 * i - 1].
set(mResultVerticiesPos[i + 1].left, mResultVerticiesPos[i + 1].top, vertex_z, mResultVerticiesUV[i + 1].left, mResultVerticiesUV[i + 1].top, mCurrentColour);
190 mCurrentColour = (colour & 0x00FFFFFF) | (mCurrentColour & 0xFF000000);
192 if (
nullptr != mNode)
208 mCurrentTexture = _rect;
210 mGeometryOutdated =
true;
212 if (
nullptr != mNode)
216 inline float len(
float x,
float y)
218 return std::sqrt(x * x + y * y);
230 const float M_PI = 3.141593f;
232 float width_base = (float)mCurrentCoord.
width;
233 float height_base = (
float)mCurrentCoord.
height;
236 float baseAngles[RECT_VERTICIES_COUNT];
237 baseAngles[0] = std::atan2((
float)mCenterPos.
left, (
float)mCenterPos.
top) +
M_PI / 2;
238 baseAngles[1] = std::atan2(- width_base + (
float)mCenterPos.
left, (
float)mCenterPos.
top) +
M_PI / 2;
239 baseAngles[2] = std::atan2(- width_base + (
float)mCenterPos.
left, - height_base + (
float)mCenterPos.
top) +
M_PI / 2;
240 baseAngles[3] = std::atan2((
float)mCenterPos.
left, - height_base + (
float)mCenterPos.
top) +
M_PI / 2;
243 float baseDistances[RECT_VERTICIES_COUNT];
244 baseDistances[0] =
len((
float)mCenterPos.
left, (
float)mCenterPos.
top);
245 baseDistances[1] =
len(- width_base + (
float)mCenterPos.
left, (
float)mCenterPos.
top);
246 baseDistances[2] =
len(- width_base + (
float)mCenterPos.
left, - height_base + (
float)mCenterPos.
top);
247 baseDistances[3] =
len((
float)mCenterPos.
left, - height_base + (
float)mCenterPos.
top);
251 FloatPoint baseVerticiesPos[RECT_VERTICIES_COUNT];
253 int offsetX = mCenterPos.
left;
254 int offsetY = mCenterPos.
top;
256 for (
int i = 0; i < RECT_VERTICIES_COUNT; ++i)
258 baseVerticiesPos[i].
left = offsetX + std::cos(-mAngle + baseAngles[i]) * baseDistances[i];
259 baseVerticiesPos[i].
top = offsetY - std::sin(-mAngle + baseAngles[i]) * baseDistances[i];
263 FloatPoint baseVerticiesUV[RECT_VERTICIES_COUNT] =
278 size_t size = RECT_VERTICIES_COUNT;
281 for (
int i = 0; i < RECT_VERTICIES_COUNT; ++i)
283 mResultVerticiesPos[i] = baseVerticiesPos[i];
284 mResultVerticiesUV[i] = baseVerticiesUV[i];
293 RECT_VERTICIES_COUNT,
300 for (
size_t i = 0; i < resultVerticiesPos.size(); ++i)
302 mResultVerticiesPos[i] = resultVerticiesPos[i];
305 size = resultVerticiesPos.size();
308 FloatPoint v0 = baseVerticiesUV[3] - baseVerticiesUV[0];
309 FloatPoint v1 = baseVerticiesUV[1] - baseVerticiesUV[0];
310 for (
size_t i = 0; i < GEOMETRY_VERTICIES_TOTAL_COUNT; ++i)
320 mResultVerticiesUV[i] = mResultVerticiesUV[size - 1];
331 for (
size_t i = 0; i < GEOMETRY_VERTICIES_TOTAL_COUNT; ++i)
335 mResultVerticiesPos[i].
left = vertex_left_base + mResultVerticiesPos[i].
left * info.
pixScaleX * 2;
336 mResultVerticiesPos[i].
top = vertex_top_base + mResultVerticiesPos[i].
top * info.
pixScaleY * -2;
341 mResultVerticiesPos[i] = mResultVerticiesPos[size - 1];