Fonts laden korrigiert
This commit is contained in:
parent
69d35b5d15
commit
70d23facf9
|
@ -1,17 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="deploymentTargetDropDown">
|
||||
<runningDeviceTargetSelectedWithDropDown>
|
||||
<Target>
|
||||
<type value="RUNNING_DEVICE_TARGET" />
|
||||
<deviceKey>
|
||||
<Key>
|
||||
<type value="SERIAL_NUMBER" />
|
||||
<value value="R52N60RNQLZ" />
|
||||
</Key>
|
||||
</deviceKey>
|
||||
</Target>
|
||||
</runningDeviceTargetSelectedWithDropDown>
|
||||
<timeTargetWasSelectedWithDropDown value="2022-10-24T10:55:25.742010800Z" />
|
||||
</component>
|
||||
</project>
|
|
@ -34,14 +34,14 @@ bool AssetManager::loadFontData(const char* path, float char_height, FontData* p
|
|||
if (!loadFile(path, &ttf_data))
|
||||
return false;
|
||||
|
||||
static unsigned char bitmap_memory[512 * 512];;
|
||||
static unsigned char bitmap_memory[STBTT_PH_VALUE * STBTT_PH_VALUE];
|
||||
FontData font_data = {};
|
||||
auto* data = reinterpret_cast<const unsigned char*>(ttf_data.data);
|
||||
stbtt_BakeFontBitmap(data,
|
||||
0,
|
||||
char_height,
|
||||
bitmap_memory,
|
||||
512, 512,
|
||||
STBTT_PH_VALUE, STBTT_PH_VALUE,
|
||||
32, 225, // latin-1 printable characters range
|
||||
font_data.char_data);
|
||||
font_data.char_height = char_height;
|
||||
|
@ -74,16 +74,16 @@ bool AssetManager::loadFontBitmap(const char *path, float char_height, Texture*
|
|||
FileBuffer ttf_data = {};
|
||||
if (!loadFile(path, &ttf_data))
|
||||
return false;
|
||||
static unsigned char bitmap_memory[512 * 512];
|
||||
static unsigned char bitmap_memory[STBTT_PH_VALUE * STBTT_PH_VALUE];
|
||||
stbtt_bakedchar char_data[225];
|
||||
stbtt_BakeFontBitmap(reinterpret_cast<const unsigned char*>(ttf_data.data),
|
||||
0,
|
||||
char_height,
|
||||
bitmap_memory,
|
||||
512, 512,
|
||||
STBTT_PH_VALUE, STBTT_PH_VALUE,
|
||||
32, 225, // latin-1 printable characters range
|
||||
char_data);
|
||||
*p_texture = Texture(512, 512, bitmap_memory, GL_R8);
|
||||
*p_texture = Texture(STBTT_PH_VALUE, STBTT_PH_VALUE, bitmap_memory, GL_R8);
|
||||
releaseFileBuffer(ttf_data);
|
||||
return true;
|
||||
}
|
||||
|
|
|
@ -63,4 +63,6 @@ protected:
|
|||
AssetManager& operator=(const AssetManager&) = delete;
|
||||
};
|
||||
|
||||
const int STBTT_PH_VALUE = 1024;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -7,6 +7,8 @@
|
|||
#include "AndroidAssetManager.h"
|
||||
#include "Renderer.h"
|
||||
#include "TouchInput.h"
|
||||
/*#include "Game.h"
|
||||
#include "base.h"*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
|
@ -48,10 +50,11 @@ NativeEngine::NativeEngine(struct android_app *app)
|
|||
//
|
||||
// Du kannst schon Assets laden, da oben der AssetManager erzeugt wurde.
|
||||
|
||||
// Ende INTEGRATION
|
||||
|
||||
// BEISPIELCODE
|
||||
m_smiley = StringRepository::global->internString("smiley_PNG42.png");
|
||||
m_smiley_pos = { 100, 100 };
|
||||
AssetManager::ptr->loadFontData("Milky Honey.ttf", 24.f, &m_font);
|
||||
//m_smiley_pos = { 100, 100 };
|
||||
// ENDE VOM BEISPIELCODE
|
||||
}
|
||||
|
||||
|
@ -100,6 +103,12 @@ void NativeEngine::gameLoop()
|
|||
android_app_clear_key_events(input_buffer);
|
||||
}
|
||||
if (input_buffer->motionEventsCount > 0) {
|
||||
float rel_size = m_display_height;
|
||||
if (m_display_height > m_display_width){
|
||||
rel_size = m_display_width;
|
||||
}
|
||||
rel_size *= 0.04f;
|
||||
//float rel_size = MIN(m_display_height, m_display_width) * 0.04f;
|
||||
for (unsigned int i = 0; i < input_buffer->motionEventsCount; ++i) {
|
||||
GameActivityMotionEvent motion_event = input_buffer->motionEvents[i];
|
||||
if (motion_event.action == AMOTION_EVENT_ACTION_DOWN) {
|
||||
|
@ -114,6 +123,29 @@ void NativeEngine::gameLoop()
|
|||
m_last_down.y = y;
|
||||
}
|
||||
}
|
||||
else if (motion_event.action == AMOTION_EVENT_ACTION_MOVE) {
|
||||
if (motion_event.pointerCount > 0) {
|
||||
GameActivityPointerAxes pointer = motion_event.pointers[0];
|
||||
float x = GameActivityPointerAxes_getX(&pointer);
|
||||
float y = GameActivityPointerAxes_getY(&pointer);
|
||||
|
||||
if (!m_in_motion) {
|
||||
// Record this motion
|
||||
m_in_motion = true;
|
||||
m_last_down.x = x;
|
||||
m_last_down.y = y;
|
||||
}
|
||||
|
||||
float dist = sqrtf((x - m_last_down.x) * (x - m_last_down.x) +
|
||||
(y - m_last_down.y) * (y - m_last_down.y));
|
||||
if (dist >= rel_size) {
|
||||
input_events[input_event_count].kind = TouchInputEventKind::InSwipe;
|
||||
input_events[input_event_count].start = {m_last_down.x, m_last_down.y};
|
||||
input_events[input_event_count].end = {x, y};
|
||||
++input_event_count;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (motion_event.action == AMOTION_EVENT_ACTION_UP) {
|
||||
if (!m_in_motion) {
|
||||
ALOGW("Got an UP motion without a corresponding DOWN motion");
|
||||
|
@ -127,8 +159,7 @@ void NativeEngine::gameLoop()
|
|||
|
||||
float dist = sqrtf((x - m_last_down.x) * (x - m_last_down.x) +
|
||||
(y - m_last_down.y) * (y - m_last_down.y));
|
||||
|
||||
if (dist < 5.f) {
|
||||
if (dist < rel_size) {
|
||||
// TAP
|
||||
ALOGI("TAP at %f %f", x, y);
|
||||
input_events[input_event_count].kind = TouchInputEventKind::Tap;
|
||||
|
@ -141,9 +172,9 @@ void NativeEngine::gameLoop()
|
|||
ALOGI("Swipe from %f %f to %f %f",
|
||||
m_last_down.x, m_last_down.y,
|
||||
x, y);
|
||||
input_events[input_event_count].kind = TouchInputEventKind::Tap;
|
||||
input_events[input_event_count].start = { m_last_down.x, m_last_down.y };
|
||||
input_events[input_event_count].end = { x, y };
|
||||
input_events[input_event_count].kind = TouchInputEventKind::EndSwipe;
|
||||
input_events[input_event_count].start = {m_last_down.x, m_last_down.y};
|
||||
input_events[input_event_count].end = {x, y};
|
||||
++input_event_count;
|
||||
}
|
||||
m_in_motion = false;
|
||||
|
@ -158,6 +189,9 @@ void NativeEngine::gameLoop()
|
|||
android_app_clear_motion_events(input_buffer);
|
||||
}
|
||||
}
|
||||
else {
|
||||
m_in_motion = false;
|
||||
}
|
||||
|
||||
if (isAnimating() && Renderer::ptr) {
|
||||
// INTEGRATION Rufe hier deine "gameloop"/"update" funktion auf, die als Parameter
|
||||
|
@ -173,14 +207,25 @@ void NativeEngine::gameLoop()
|
|||
// float display_width,
|
||||
// float display_height)
|
||||
|
||||
/*static bool erster_aufruf = true;
|
||||
if (erster_aufruf){
|
||||
computeWindowWidthHeight(m_display_width, m_display_height);
|
||||
initKrimiDinner();
|
||||
erster_aufruf = false;
|
||||
}
|
||||
|
||||
krimiDinnerLoop(&m_state, input_events, input_event_count,
|
||||
m_display_width, m_display_height);*/
|
||||
|
||||
//ENDE INTEGRATION
|
||||
|
||||
// BEISPIELCODE
|
||||
static float t = 1.f;
|
||||
static float x = 1.f;
|
||||
static float d = -0.01f;
|
||||
t += d;
|
||||
if (t <= 0.f)
|
||||
x += d;
|
||||
if ( x <= 0.f)
|
||||
d *= -1.f;
|
||||
else if (t >= 1.f)
|
||||
else if (x >= 1.f)
|
||||
d *= -1.f;
|
||||
|
||||
if (input_event_count > 0) {
|
||||
|
@ -190,31 +235,7 @@ void NativeEngine::gameLoop()
|
|||
}
|
||||
|
||||
Renderer::ptr->addRect(100, 100, 500, 500, 0.3f, 0.3f, 0.3f, 1.f);
|
||||
Renderer::ptr->addRect(m_smiley_pos.x, m_smiley_pos.y, 500, 500, 0.f, t*t, 1.f - t*t, 1.f, m_smiley);
|
||||
|
||||
|
||||
float x = 50;
|
||||
float y = 50;
|
||||
|
||||
y += m_font.baseline_adjust;
|
||||
const char* text = "Hallo Welt";
|
||||
for (const char* c = text; *c != '\0'; ++c) {
|
||||
if (*c >= 32) {
|
||||
stbtt_aligned_quad quad;
|
||||
stbtt_GetBakedQuad(m_font.char_data, 512, 512, (int)*c - 32, &x, &y, &quad, 1);
|
||||
float w = quad.x1 - quad.x0;
|
||||
float h = quad.y1 - quad.y0;
|
||||
|
||||
|
||||
Renderer::ptr->addFontRect(
|
||||
x, y,
|
||||
w, h,
|
||||
24.f,
|
||||
StringRepository::global->internString("Milky Honey.ttf"),
|
||||
quad.s0, quad.t0,
|
||||
quad.s1, quad.t1);
|
||||
}
|
||||
}
|
||||
Renderer::ptr->addRect(m_smiley_pos.x, m_smiley_pos.y, 500, 500, 0.f, x*x, 1.f - x*x, 1.f, m_smiley);
|
||||
// ENDE VOM BEISPIELCODE
|
||||
}
|
||||
|
||||
|
|
|
@ -8,8 +8,6 @@
|
|||
#include "StringRepository.h"
|
||||
#include "GameState.h"
|
||||
|
||||
#include "Font.h"
|
||||
|
||||
#include <game-activity/native_app_glue/android_native_app_glue.h>
|
||||
#include <EGL/egl.h>
|
||||
|
||||
|
@ -63,9 +61,6 @@ private:
|
|||
StringHandle m_smiley;
|
||||
Position m_smiley_pos;
|
||||
|
||||
StringHandle m_font_bitmap;
|
||||
FontData m_font;
|
||||
|
||||
Position m_last_down;
|
||||
bool m_in_motion;
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "Renderer.h"
|
||||
#include "Log.h"
|
||||
#include "AssetManager.h"
|
||||
#include "Texture.h"
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
|
@ -229,12 +230,13 @@ void Renderer::addFontRect(float x,
|
|||
float h,
|
||||
float char_height,
|
||||
StringHandle font,
|
||||
StringHandle id,
|
||||
float src_x0,
|
||||
float src_y0,
|
||||
float src_x1,
|
||||
float src_y1)
|
||||
{
|
||||
addFontRect(x, y, w, h, 0.f, 0.f, 0.f, 1.f, char_height, font, src_x0, src_y0, src_x1, src_y1);
|
||||
addFontRect(x, y, w, h, 0.f, 0.f, 0.f, 1.f, char_height, font, id, src_x0, src_y0, src_x1, src_y1);
|
||||
}
|
||||
|
||||
void Renderer::addFontRect(float x,
|
||||
|
@ -247,18 +249,19 @@ void Renderer::addFontRect(float x,
|
|||
float a,
|
||||
float char_height,
|
||||
StringHandle font,
|
||||
StringHandle id,
|
||||
float src_x0,
|
||||
float src_y0,
|
||||
float src_x1,
|
||||
float src_y1)
|
||||
{
|
||||
if (m_textures.find(font) == m_textures.end()) {
|
||||
if (m_textures.find(id) == m_textures.end()) {
|
||||
Texture tex;
|
||||
if (!AssetManager::ptr->loadFontBitmap(StringRepository::global->getString(font), char_height, &tex)) {
|
||||
ALOGE("Failed to load texture");
|
||||
return;
|
||||
}
|
||||
m_textures.insert(std::make_pair(font, tex));
|
||||
m_textures.insert(std::make_pair(id, tex));
|
||||
}
|
||||
|
||||
Rect rect = {};
|
||||
|
@ -276,7 +279,7 @@ void Renderer::addFontRect(float x,
|
|||
rect.a = a;
|
||||
rect.expand_r = 1;
|
||||
m_rects.push_back(rect);
|
||||
m_draw_textures.push_back(font);
|
||||
m_draw_textures.push_back(id);
|
||||
}
|
||||
|
||||
void Renderer::renderFrame(float width, float height)
|
||||
|
@ -284,7 +287,8 @@ void Renderer::renderFrame(float width, float height)
|
|||
assert(m_rects.size() == m_draw_textures.size());
|
||||
|
||||
glViewport(0, 0, static_cast<int>(width), static_cast<int>(height));
|
||||
glClearColor(0.8f, 0.3f, 0.3f, 1.f);
|
||||
//glClearColor(0.8f, 0.3f, 0.3f, 1.f);
|
||||
glClearColor(0.0f, 0.0f, 0.0f, 1.f);
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
const auto rect_count = static_cast<GLsizei>(m_rects.size());
|
||||
|
@ -340,4 +344,21 @@ void Renderer::renderFrame(float width, float height)
|
|||
}
|
||||
m_rects.clear();
|
||||
m_draw_textures.clear();
|
||||
}
|
||||
|
||||
void Renderer::getTextureSize(
|
||||
StringHandle texture,
|
||||
unsigned int* w,
|
||||
unsigned int* h)
|
||||
{
|
||||
if (m_textures.find(texture) == m_textures.end()) {
|
||||
Texture tex;
|
||||
if (!AssetManager::ptr->loadTexture(StringRepository::global->getString(texture), &tex)) {
|
||||
ALOGE("Failed to load texture");
|
||||
return;
|
||||
}
|
||||
m_textures.insert(std::make_pair(texture, tex));
|
||||
}
|
||||
Texture tex = m_textures[texture];
|
||||
tex.getTextureSize(w, h);
|
||||
}
|
|
@ -131,6 +131,7 @@ public:
|
|||
float h,
|
||||
float char_height,
|
||||
StringHandle font,
|
||||
StringHandle id,
|
||||
float src_x0,
|
||||
float src_y0,
|
||||
float src_x1,
|
||||
|
@ -161,6 +162,7 @@ public:
|
|||
float a,
|
||||
float char_height,
|
||||
StringHandle font,
|
||||
StringHandle id,
|
||||
float src_x0,
|
||||
float src_y0,
|
||||
float src_x1,
|
||||
|
@ -173,6 +175,14 @@ public:
|
|||
/// @param height height of the screen
|
||||
void renderFrame(float width, float height);
|
||||
|
||||
/// @brief loads texture (if not loaded) to get texture size
|
||||
/// \param w output width in pixels
|
||||
/// \param h output height in pixels
|
||||
void getTextureSize(
|
||||
StringHandle texture,
|
||||
unsigned int* w,
|
||||
unsigned int* h);
|
||||
|
||||
private:
|
||||
Renderer();
|
||||
~Renderer();
|
||||
|
|
|
@ -21,6 +21,8 @@ Texture::Texture(unsigned int width, unsigned int height, const void *data)
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
width_px = width;
|
||||
height_px = height;
|
||||
}
|
||||
|
||||
Texture::Texture(unsigned int width, unsigned int height, const void* data, GLint format)
|
||||
|
@ -44,6 +46,8 @@ Texture::Texture(unsigned int width, unsigned int height, const void* data, GLin
|
|||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glGenerateMipmap(GL_TEXTURE_2D);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
width_px = width;
|
||||
height_px = height;
|
||||
}
|
||||
|
||||
void Texture::destroy()
|
||||
|
@ -54,4 +58,15 @@ void Texture::destroy()
|
|||
void Texture::bind() const
|
||||
{
|
||||
glBindTexture(GL_TEXTURE_2D, m_texture);
|
||||
}
|
||||
|
||||
void Texture::getTextureSize(
|
||||
unsigned int* w,
|
||||
unsigned int* h){
|
||||
if (w != NULL){
|
||||
*w = width_px;
|
||||
}
|
||||
if (h != NULL){
|
||||
*h = height_px;
|
||||
}
|
||||
}
|
|
@ -30,8 +30,18 @@ public:
|
|||
/// @brief Binds the texture to @c GL_TEXTURE_2D
|
||||
void bind() const;
|
||||
|
||||
/// @brief get texture size
|
||||
/// \param w output width in pixels
|
||||
/// \param h output height in pixels
|
||||
void getTextureSize(
|
||||
unsigned int* w,
|
||||
unsigned int* h);
|
||||
|
||||
private:
|
||||
GLuint m_texture;
|
||||
|
||||
int width_px;
|
||||
int height_px;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -13,7 +13,11 @@ enum class TouchInputEventKind
|
|||
Tap,
|
||||
|
||||
/// The user "swiped" from a start position to an end position
|
||||
Swipe
|
||||
EndSwipe,
|
||||
|
||||
///
|
||||
InSwipe
|
||||
/// The user "swiped" from a start position to an end position, but didn't stop yet
|
||||
};
|
||||
|
||||
/// @brief Describes a touch input event
|
||||
|
|
Loading…
Reference in New Issue
Block a user