1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149

#include "fsCNativeSprite.h"

#include <fsCore/src/debug/fsAssert.h>
#include <fsCore/fsRect.h>

#include <fsAppCore/fsIDisplay.h>

#include "../../../src/fsCBrush.h"

#include "../../../fsISpriteRenderData.h"
#include "../../../src/fsCMaterial.h"

#include "../fsCTexture.h"
#include "fsCBgfx2d.h"


void fsCNativeSprite::polygonInfoSetDo(fsIRenderData::fsSPolyInfo const& pPolyInfo)
{
}

void fsCNativeSprite::textureWrapSetDo()
{
}

void fsCNativeSprite::uvSetDo(const fsRect& pOffest)
{
}

void fsCNativeSprite::alphaBlendModeSetDo(fsS32 pAlphaBlendMode)
{
}

void fsCNativeSprite::renderDo()
{
	if(mWidth && mHeight)
	{
		const fsU32 tint = fsNBgfx2d::abgrGet(mTint.mR, mTint.mG, mTint.mB, mTint.mA);

		if (mTexture)
		{
			const fsF32 texWidth = static_cast<fsF32>(mTexture->textureWidthGet());
			const fsF32 texHeight = static_cast<fsF32>(mTexture->textureHeightGet());

			fsF32 u0 = 0.0f;
			fsF32 v0 = 0.0f;
			fsF32 u1 = 1.0f;
			fsF32 v1 = 1.0f;
			if (texWidth > 0.0f && texHeight > 0.0f)
			{
				u0 = static_cast<fsF32>(mBrush->offsetGet().x) / texWidth;
				v0 = static_cast<fsF32>(mBrush->offsetGet().y) / texHeight;
				if (mScaled)
				{
					// stretch the full brush rect over the sprite
					u1 = u0 + static_cast<fsF32>(mBrush->dimensionsGet().x) / texWidth;
					v1 = v0 + static_cast<fsF32>(mBrush->dimensionsGet().y) / texHeight;
				}
				else
				{
					// crop - sample exactly widthxheight texels
					u1 = u0 + static_cast<fsF32>(mWidth) / texWidth;
					v1 = v0 + static_cast<fsF32>(mHeight) / texHeight;
				}
			}

			fsNBgfx2d::batchQuad(mRenderMatrix,
				mTexture->textureGet(), mTexture->samplerFlagsGet(),
				static_cast<fsF32>(-mWidth) / 2.0f, static_cast<fsF32>(-mHeight) / 2.0f,
				static_cast<fsF32>(mWidth), static_cast<fsF32>(mHeight),
				u0, v0, u1, v1,
				tint);
		}
		else
		{
			fsNBgfx2d::batchQuad(mRenderMatrix,
				fsNBgfx2d::whiteTextureGet(), 0,
				static_cast<fsF32>(-mWidth) / 2.0f, static_cast<fsF32>(-mHeight) / 2.0f,
				static_cast<fsF32>(mWidth), static_cast<fsF32>(mHeight),
				0.0f, 0.0f, 1.0f, 1.0f,
				tint);
		}
	}
}

void fsCNativeSprite::vertsSetDo(std::vector<fsVec2d> const& pVerts)
{
	mWidth = pVerts[fsISpriteRenderData::eINDEX_TR].x - pVerts[fsISpriteRenderData::eINDEX_TL].x,
	mHeight = pVerts[fsISpriteRenderData::eINDEX_BL].y - pVerts[fsISpriteRenderData::eINDEX_TL].y;
}

void fsCNativeSprite::brushSetDo(std::shared_ptr<fsCBrush> pBrush)
{
	mBrush = pBrush;
	mWidth = pBrush->dimensionsGet().x;
	mHeight = pBrush->dimensionsGet().y;
	mTexture = static_cast<fsCTexture*>(pBrush->textureGet().get());
}

void fsCNativeSprite::colourSetDo(const fsSColour4B& pColour)
{
	mTint = pColour;
}

fsBool fsCNativeSprite::hitTest(const fsPoint& pLocalPos, fsBool pRequireHitMap) const<--- The member function 'fsCNativeSprite::hitTest' can be static.
{
	return false;
}

void fsCNativeSprite::widthSetDo(fsS32 pWidth)
{
	mWidth = pWidth;
	mScaled = true;
}

void fsCNativeSprite::heightSetDo(fsS32 pHeight)
{
	mHeight = pHeight;
	mScaled = true;
}

fsS32 fsCNativeSprite::widthGet() const
{
	return mWidth;
}

fsS32 fsCNativeSprite::heightGet() const
{
	return mHeight;
}

std::shared_ptr<fsCBrush> fsCNativeSprite::brushGet() const
{
	return mBrush;
}

fsCNativeSprite::fsCNativeSprite():
fsINative(),
mWidth(0),
mHeight(0),
mTint(255, 255, 255, 255),
mTexture(nullptr),
mScaled(false)
{
}

fsCNativeSprite::~fsCNativeSprite()
{
}