Added in all the other characters (testing)
This commit is contained in:
@ -8,12 +8,7 @@
|
||||
#include "vncharacter.h"
|
||||
|
||||
|
||||
void vnCharacterInit(
|
||||
vncharacter_t *character, texture_t *texture,
|
||||
int32_t baseWidth, int32_t baseHeight,
|
||||
int32_t faceX, int32_t faceY,
|
||||
int32_t faceWidth, int32_t faceHeight
|
||||
) {
|
||||
void vnCharacterInit(vncharacter_t *character, texture_t *texture) {
|
||||
character->x = 0;
|
||||
character->y = 0;
|
||||
character->z = 0;
|
||||
@ -24,89 +19,36 @@ void vnCharacterInit(
|
||||
|
||||
character->scaleX = 1;
|
||||
character->scaleY = 1;
|
||||
|
||||
character->layerCount = 0;
|
||||
character->texture = texture;
|
||||
character->talking = false;
|
||||
character->blinkStart = 0;
|
||||
|
||||
character->baseWidth = baseWidth;
|
||||
character->baseHeight = baseHeight;
|
||||
character->faceX = faceX;
|
||||
character->faceY = faceY;
|
||||
character->faceWidth = faceWidth;
|
||||
character->faceHeight = faceHeight;
|
||||
|
||||
character->emotion = VN_CHARACTER_EMOTION_HAPPY;
|
||||
|
||||
// Init the primitive.
|
||||
primitiveInit(&character->primitive,
|
||||
QUAD_VERTICE_COUNT * VN_CHARACTER_QUAD_COUNT,
|
||||
QUAD_INDICE_COUNT * VN_CHARACTER_QUAD_COUNT
|
||||
);
|
||||
|
||||
// Buffer the base quad, this never changes (currently)
|
||||
_vnCharacterBuffer(character, 0, 0, baseWidth, baseHeight, 0, 0, 0);
|
||||
_vnCharacterFaceBuffer(character, 0, VN_CHARACTER_QUAD_EYEBROWS);
|
||||
_vnCharacterFaceBuffer(character, 0, VN_CHARACTER_QUAD_EYES);
|
||||
_vnCharacterFaceBuffer(character, 0, VN_CHARACTER_QUAD_MOUTH);
|
||||
}
|
||||
|
||||
void _vnCharacterBuffer(vncharacter_t *character,
|
||||
int32_t x, int32_t y, int32_t width, int32_t height, int32_t tx, int32_t ty,
|
||||
int32_t i
|
||||
) {
|
||||
// Calc size for each pixel.
|
||||
float ps = 1.0f / (float)character->baseHeight;// Prefer Height
|
||||
float tpx = 1.0f / (float)character->texture->width;
|
||||
float tpy = 1.0f / (float)character->texture->height;
|
||||
|
||||
// Center inside the character
|
||||
x -= character->baseWidth / 2;
|
||||
y += character->baseHeight / 2;
|
||||
|
||||
quadBuffer(&character->primitive, 0.001f * (float)i,
|
||||
(float)x * ps, 1 - (float)y * ps,
|
||||
(float)tx * tpx, (float)ty * tpy,
|
||||
(float)(x + width) * ps, 1 - (float)(y + height) * ps,
|
||||
(float)(tx + width) * tpx, (float)(ty + height) * tpy,
|
||||
i * QUAD_VERTICE_COUNT, i * QUAD_INDICE_COUNT
|
||||
);
|
||||
}
|
||||
|
||||
void _vnCharacterFaceBuffer(vncharacter_t *character,
|
||||
int32_t col, int32_t i
|
||||
) {
|
||||
_vnCharacterBuffer(character,
|
||||
character->faceX, character->faceY,
|
||||
character->faceWidth, character->faceHeight,
|
||||
character->baseWidth + (character->faceWidth * col),
|
||||
character->faceHeight * (i -1),
|
||||
i
|
||||
QUAD_VERTICE_COUNT * VN_CHARACTER_LAYERS_MAX,
|
||||
QUAD_INDICE_COUNT * VN_CHARACTER_LAYERS_MAX
|
||||
);
|
||||
}
|
||||
|
||||
void vnCharacterUpdate(vncharacter_t *character, engine_t *engine) {
|
||||
uint8_t eyes, mouth, eyebrows;
|
||||
float t;
|
||||
float speed, amount;
|
||||
|
||||
// Setup frames based on the emotion.
|
||||
mouth = character->emotion % 0x04;
|
||||
eyes = (character->emotion/0x04) % 0x04;
|
||||
eyebrows = ((character->emotion/0x04)/0x04) % 0x05;
|
||||
|
||||
_vnCharacterFaceBuffer(character, eyebrows, VN_CHARACTER_QUAD_EYEBROWS);
|
||||
_vnCharacterFaceBuffer(character, eyes, VN_CHARACTER_QUAD_EYES);
|
||||
|
||||
mouth *= VN_CHARACTER_TALKING_FRAME_COUNT;
|
||||
if(character->talking) {
|
||||
t = animForwardAndBackwardScaled(mathModFloat(
|
||||
engine->time.current * animTimeScaleFromFrameTime(3, 0.2f), 1.0f
|
||||
));
|
||||
mouth += (uint8_t)(t * VN_CHARACTER_TALKING_FRAME_COUNT);
|
||||
}
|
||||
_vnCharacterFaceBuffer(character, mouth, VN_CHARACTER_QUAD_MOUTH);
|
||||
// mouth = character->emotion % 0x04;
|
||||
// eyes = (character->emotion/0x04) % 0x04;
|
||||
// eyebrows = ((character->emotion/0x04)/0x04) % 0x05;
|
||||
|
||||
// _vnCharacterFaceBuffer(character, eyebrows, VN_CHARACTER_QUAD_EYEBROWS);
|
||||
// _vnCharacterFaceBuffer(character, eyes, VN_CHARACTER_QUAD_EYES);
|
||||
|
||||
// mouth *= VN_CHARACTER_TALKING_FRAME_COUNT;
|
||||
// if(character->talking) {
|
||||
// t = animForwardAndBackwardScaled(mathModFloat(
|
||||
// engine->time.current * animTimeScaleFromFrameTime(3, 0.2f), 1.0f
|
||||
// ));
|
||||
// mouth += (uint8_t)(t * VN_CHARACTER_TALKING_FRAME_COUNT);
|
||||
// }
|
||||
// _vnCharacterFaceBuffer(character, mouth, VN_CHARACTER_QUAD_MOUTH);
|
||||
// float n;
|
||||
// // Update the blinking frames
|
||||
// n = (engine->time.current - character->blinkStart) * 3.0f;
|
||||
@ -134,7 +76,6 @@ void vnCharacterUpdate(vncharacter_t *character, engine_t *engine) {
|
||||
// }
|
||||
|
||||
// Update the scale frames for breathing / talk breathing
|
||||
float speed, amount;
|
||||
speed = 0.2f;
|
||||
amount = 90.0f;
|
||||
t = animForwardAndBackwardScaled(
|
||||
@ -145,6 +86,60 @@ void vnCharacterUpdate(vncharacter_t *character, engine_t *engine) {
|
||||
character->scaleY = 1 - t;
|
||||
}
|
||||
|
||||
|
||||
uint8_t vnCharacterLayerAdd(vncharacter_t *character,
|
||||
uint8_t frames,
|
||||
int32_t lx, int32_t ly,
|
||||
int32_t x, int32_t y,
|
||||
int32_t width, int32_t height
|
||||
) {
|
||||
uint8_t i;
|
||||
vncharacterlayer_t *layer;
|
||||
|
||||
i = character->layerCount++;
|
||||
layer = character->layers + i;
|
||||
|
||||
layer->frames = frames;
|
||||
layer->lx = lx;
|
||||
layer->ly = ly;
|
||||
layer->x = x;
|
||||
layer->y =y;
|
||||
layer->width = width;
|
||||
layer->height = height;
|
||||
|
||||
vnCharacterLayerSetFrame(character, i, 0);
|
||||
return i;
|
||||
}
|
||||
|
||||
void vnCharacterLayerSetFrame(vncharacter_t *character, uint8_t l, uint8_t f) {
|
||||
vncharacterlayer_t *layer;
|
||||
vncharacterlayer_t *base;
|
||||
|
||||
layer = character->layers + l;
|
||||
base = character->layers;
|
||||
f = f % layer->frames;
|
||||
|
||||
float ps = 1.0f / (float)base->height;
|
||||
float tpx = 1.0f / (float)character->texture->width;
|
||||
float tpy = 1.0f / (float)character->texture->height;
|
||||
|
||||
int32_t x = layer->x - (base->width / 2);
|
||||
int32_t y = layer->y + (base->height / 2);
|
||||
int32_t tx = layer->lx + (layer->width * f);
|
||||
|
||||
quadBuffer(&character->primitive, 0.001f * (float)l,
|
||||
(float)x * ps, 1 - (float)y * ps,
|
||||
(float)tx * tpx,
|
||||
(float)layer->ly * tpy,
|
||||
|
||||
(float)(x + layer->width) * ps,
|
||||
1 - (float)(y + layer->height) * ps,
|
||||
(float)(tx + layer->width) * tpx,
|
||||
(float)(layer->ly + layer->height) * tpy,
|
||||
l * QUAD_VERTICE_COUNT, l * QUAD_INDICE_COUNT
|
||||
);
|
||||
}
|
||||
|
||||
void vnCharacterRender(vncharacter_t *character, shader_t *shader) {
|
||||
shaderUsePositionAndScale(shader,
|
||||
character->x, character->y, character->z,
|
||||
@ -152,7 +147,9 @@ void vnCharacterRender(vncharacter_t *character, shader_t *shader) {
|
||||
character->scaleX, character->scaleY, 1
|
||||
);
|
||||
shaderUseTexture(shader, character->texture);
|
||||
primitiveDraw(&character->primitive, 0, -1);
|
||||
primitiveDraw(
|
||||
&character->primitive, 0, character->layerCount * QUAD_INDICE_COUNT
|
||||
);
|
||||
}
|
||||
|
||||
void vnCharacterDispose(vncharacter_t *character) {
|
||||
|
Reference in New Issue
Block a user