Skip to content

Commit

Permalink
Enable using render targets in kr_image
Browse files Browse the repository at this point in the history
  • Loading branch information
tcdude committed Aug 22, 2023
1 parent 405deae commit eb224f5
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 8 deletions.
13 changes: 10 additions & 3 deletions Sources/krink/graphics2/imagepainter.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
#include "imagepainter.h"
#include "kinc/graphics4/rendertarget.h"
#include "krink/image.h"

#include <kinc/graphics4/graphics.h>
#include <kinc/graphics4/indexbuffer.h>
Expand All @@ -23,7 +25,8 @@ static kinc_g4_shader_t vert_shader;
static kinc_g4_shader_t frag_shader;
static kinc_g4_pipeline_t pipeline;
static kinc_g4_texture_unit_t texunit;
static kinc_g4_texture_t *last_texture = NULL;
static void *last_texture = NULL;
static kr_image_tex_type_t last_type = KR_IMAGE_TEX_TYPE_TEXTURE;
static kinc_g4_constant_location_t proj_mat_loc;
static kinc_matrix4x4_t projection_matrix;
static float *rect_verts = NULL;
Expand Down Expand Up @@ -166,7 +169,10 @@ void kr_isp_draw_buffer(bool end) {
kinc_g4_set_matrix4(proj_mat_loc, &projection_matrix);
kinc_g4_set_vertex_buffer(&vertex_buffer);
kinc_g4_set_index_buffer(&index_buffer);
kinc_g4_set_texture(texunit, last_texture);
if (last_type == KR_IMAGE_TEX_TYPE_TEXTURE)
kinc_g4_set_texture(texunit, last_texture);
else if (last_type == KR_IMAGE_TEX_TYPE_RENDERTARGET)
kinc_g4_render_target_use_color_as_texture(last_texture, texunit);
kinc_g4_set_texture_addressing(texunit, KINC_G4_TEXTURE_ADDRESSING_CLAMP,
KINC_G4_TEXTURE_ADDRESSING_CLAMP);
kinc_g4_set_texture_mipmap_filter(texunit, bilinear_filter ? KINC_G4_MIPMAP_FILTER_LINEAR
Expand Down Expand Up @@ -203,7 +209,7 @@ void kr_isp_set_projection_matrix(kinc_matrix4x4_t mat) {
void kr_isp_draw_scaled_sub_image(kr_image_t *img, float sx, float sy, float sw, float sh, float dx,
float dy, float dw, float dh, float opacity, uint32_t color,
kr_matrix3x3_t transformation) {
kinc_g4_texture_t *tex = img->tex;
void *tex = img->tex;
if (buffer_start + buffer_index + 1 >= KR_G2_ISP_BUFFER_SIZE ||
(last_texture != NULL && tex != last_texture))
kr_isp_draw_buffer(false);
Expand All @@ -217,6 +223,7 @@ void kr_isp_draw_scaled_sub_image(kr_image_t *img, float sx, float sy, float sw,

++buffer_index;
last_texture = tex;
last_type = img->type;
}

#ifdef KR_FULL_RGBA_FONTS
Expand Down
25 changes: 21 additions & 4 deletions Sources/krink/image.c
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
#include "image.h"
#include "kinc/graphics4/texture.h"
#include "memory.h"

#include <assert.h>
Expand All @@ -12,17 +13,19 @@ void kr_image_init(kr_image_t *img) {
img->in_memory = false;
img->loaded = false;
img->owns_tex = false;
img->type = KR_IMAGE_TEX_TYPE_TEXTURE;
}

void kr_image_init_empty(kr_image_t *img, int width, int height) {
kr_image_init(img);
img->tex = (kinc_g4_texture_t *)kr_malloc(sizeof(kinc_g4_texture_t));
kinc_g4_texture_init(img->tex, width, height, KINC_IMAGE_FORMAT_RGBA32);
img->owns_tex = true;
uint32_t *data = (uint32_t *)kinc_g4_texture_lock(img->tex);
int stride = kinc_g4_texture_stride(img->tex) / 4;
for (int y = 0; y < img->tex->tex_height; ++y) {
for (int x = 0; x < img->tex->tex_width; ++x) {
kinc_g4_texture_t *tex = (kinc_g4_texture_t *)img->tex;
uint32_t *data = (uint32_t *)kinc_g4_texture_lock(tex);
int stride = kinc_g4_texture_stride(tex) / 4;
for (int y = 0; y < tex->tex_height; ++y) {
for (int x = 0; x < tex->tex_width; ++x) {
data[y * stride + x] = 0;
}
}
Expand Down Expand Up @@ -73,6 +76,20 @@ void kr_image_from_texture(kr_image_t *img, kinc_g4_texture_t *tex, float real_w
img->owns_tex = false;
}

void kr_image_from_rendertarget(kr_image_t *img, kinc_g4_render_target_t *rendertarget,
float real_width, float real_height) {
kr_image_init(img);
img->tex = rendertarget;
img->path = "";
img->image = NULL;
img->loaded = true;
img->in_memory = false;
img->real_width = real_width == 0.0f ? (float)rendertarget->texWidth : real_width;
img->real_height = real_height == 0.0f ? (float)rendertarget->texHeight : real_height;
img->owns_tex = false;
img->type = KR_IMAGE_TEX_TYPE_RENDERTARGET;
}

void kr_image_generate_mipmaps(kr_image_t *img, int levels) {
kinc_g4_texture_generate_mipmaps(img->tex, levels);
}
Expand Down
21 changes: 20 additions & 1 deletion Sources/krink/image.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <kinc/graphics4/rendertarget.h>
#include <kinc/graphics4/texture.h>
#include <kinc/image.h>
#include <stdbool.h>
Expand All @@ -13,11 +14,17 @@
extern "C" {
#endif

typedef enum kr_image_tex_type {
KR_IMAGE_TEX_TYPE_TEXTURE,
KR_IMAGE_TEX_TYPE_RENDERTARGET,
} kr_image_tex_type_t;

typedef struct kr_image {
kinc_g4_texture_t *tex;
void *tex;
kinc_image_t *image;
float real_width, real_height;
const char *path;
kr_image_tex_type_t type;
bool in_memory, loaded, owns_tex;
} kr_image_t;

Expand Down Expand Up @@ -55,6 +62,18 @@ void kr_image_load(kr_image_t *img, const char *path, bool keep_in_memory);
void kr_image_from_texture(kr_image_t *img, kinc_g4_texture_t *tex, float real_width,
float real_height);

/// <summary>
/// Initialize an image from a render target.
/// </summary>
/// <param name="img"></param>
/// <param name="rendertarget"></param>
/// <param name="real_width">Either provide real width or set to 0 to use the information stored in
/// rendertarget</param>
/// <param name="real_height">Either provide real width or set to 0 to use the information stored in
/// rendertarget</param>
void kr_image_from_rendertarget(kr_image_t *img, kinc_g4_render_target_t *rendertarget,
float real_width, float real_height);

/// <summary>
/// Generate mipmaps for a loaded image.
/// </summary>
Expand Down

0 comments on commit eb224f5

Please sign in to comment.