src/texture.c

Wed, 02 Jul 2025 23:21:17 +0200

author
Mike Becker <universe@uap-core.de>
date
Wed, 02 Jul 2025 23:21:17 +0200
changeset 174
0009b982bc7d
parent 168
f70569c49c24
permissions
-rw-r--r--

resolve TODOs regarding input.h

a) mouse position must be integer, because it can be negative (though rarely)
b) we should not trade "access complexity" for space in the scancodes array

50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
1 /*
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
3 * Copyright 2024 Mike Becker. All rights reserved.
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
4 *
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
5 * Redistribution and use in source and binary forms, with or without
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
6 * modification, are permitted provided that the following conditions are met:
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
7 *
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
8 * 1. Redistributions of source code must retain the above copyright
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
9 * notice, this list of conditions and the following disclaimer.
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
10 *
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
11 * 2. Redistributions in binary form must reproduce the above copyright
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
12 * notice, this list of conditions and the following disclaimer in the
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
13 * documentation and/or other materials provided with the distribution.
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
14 *
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
25 * POSSIBILITY OF SUCH DAMAGE.
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
26 */
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
27
106
895f92cff6b8 bring back error.h to reduce compile dependencies
Mike Becker <universe@uap-core.de>
parents: 95
diff changeset
28 #include "ascension/error.h"
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
29 #include "ascension/context.h"
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30 #include "ascension/texture.h"
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
31 #include "ascension/filesystem.h"
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33 #include <assert.h>
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 #include <GL/glew.h>
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
35 #include <SDL2/SDL_image.h>
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36
149
560772519ff9 resolve east-west conflict
Mike Becker <universe@uap-core.de>
parents: 135
diff changeset
37 void asc_texture_bind(const AscTexture *tex, int uniform_location, int unit) {
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 glActiveTexture(GL_TEXTURE0 + unit);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 GLenum error = glGetError();
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 if (error == GL_INVALID_ENUM) {
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
41 GLint max_units;
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
42 glGetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &max_units);
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
43 asc_error("Tried to use more texture units than available (%u/%u).", unit, max_units);
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
44 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
45 glBindTexture(tex->target, tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
46 glUniform1i(uniform_location, unit);
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
47 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
48 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
49
149
560772519ff9 resolve east-west conflict
Mike Becker <universe@uap-core.de>
parents: 135
diff changeset
50 void asc_texture_from_surface(AscTexture *tex, const SDL_Surface *surface) {
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
51 if (tex->tex_id == 0) {
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
52 asc_error("Tried to use uninitialized texture (%"PRIxPTR ").", (uintptr_t) tex);
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
53 return;
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
54 }
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
55 tex->width = surface->w;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
56 tex->height = surface->h;
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 glBindTexture(tex->target,tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
58 glPixelStorei(GL_UNPACK_ROW_LENGTH,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 surface->pitch / surface->format->BytesPerPixel);
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
60
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
61 // Determine the format and internal format based on the SDL surface format
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
62 GLint internal_format;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
63 GLenum format;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
64 switch (surface->format->format) {
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
65 case SDL_PIXELFORMAT_RGB24:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
66 internal_format = GL_RGB8;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
67 format = GL_RGB;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
68 break;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
69 case SDL_PIXELFORMAT_BGR24:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
70 internal_format = GL_RGB8;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
71 format = GL_BGR;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
72 break;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
73 case SDL_PIXELFORMAT_RGBA32:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
74 case SDL_PIXELFORMAT_ABGR32:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
75 internal_format = GL_RGBA8;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
76 format = GL_RGBA;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
77 break;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
78 case SDL_PIXELFORMAT_ARGB32:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
79 case SDL_PIXELFORMAT_BGRA32:
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
80 internal_format = GL_RGBA8;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
81 format = GL_BGRA;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
82 break;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
83 default:
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
84 asc_error("Unsupported pixel format: %x", surface->format->format);
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
85 return;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
86 }
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
87 glTexImage2D(tex->target, 0, internal_format,
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
88 surface->w, surface->h,
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
89 0, format,
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 GL_UNSIGNED_BYTE, surface->pixels);
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
91 // TODO: replace catch all with proper error handling for this single call
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
92 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
93 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
95 void asc_texture_from_file(AscTexture *tex, const char *name) {
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
96 cxmutstr filepath = asc_filesystem_combine_paths(cx_strcast(asc_context.texture_path), cx_str(name));
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
97 asc_dprintf("Load texture from %" CX_PRIstr, CX_SFMT(filepath));
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
98 SDL_Surface *image = IMG_Load(filepath.ptr);
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
99 cx_strfree(&filepath);
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
100 if (image == NULL) {
91
8433c87c0f51 improve error.c functions
Mike Becker <universe@uap-core.de>
parents: 89
diff changeset
101 asc_error("Failed to load texture: %s", IMG_GetError());
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
102 return;
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
103 }
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
104 asc_texture_from_surface(tex, image);
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
105 asc_dprintf("Free temporary surface %"PRIxPTR, (uintptr_t) image);
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
106 SDL_FreeSurface(image);
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
107 }
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
108
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
109 void asc_texture_init(
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
110 AscTexture *tex,
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
111 unsigned count,
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
112 enum asc_texture_target target,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
113 enum asc_texture_min_filter min_filter,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
114 enum asc_texture_mag_filter mag_filter
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
115 ) {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
116 static const GLenum texture_targets[] = {
88
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
117 GL_TEXTURE_RECTANGLE,
6234b7ea48f3 add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents: 86
diff changeset
118 GL_TEXTURE_2D,
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
119 };
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
120 static const GLint texture_filters[] = {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
121 GL_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
122 GL_LINEAR,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
123 GL_NEAREST_MIPMAP_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
124 GL_LINEAR_MIPMAP_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
125 GL_NEAREST_MIPMAP_LINEAR,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
126 GL_LINEAR_MIPMAP_LINEAR
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
127 };
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
128 assert(target < sizeof(texture_targets) / sizeof(GLenum));
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
129 assert(min_filter < sizeof(texture_filters) / sizeof(GLint));
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
130 assert(mag_filter < 2); // mag filter only supports nearest/linear
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
131
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
132 GLuint textures[count];
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
133 glGenTextures(count, textures);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
134
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
135 for (unsigned i = 0; i < count; ++i) {
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
136 memset(&tex[i], 0, sizeof(AscTexture));
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
137 tex[i].tex_id = textures[i];
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
138 tex[i].target = texture_targets[target];
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
139 glBindTexture(tex[i].target, tex[i].tex_id);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
140 glTexParameteri(tex[i].target, GL_TEXTURE_MIN_FILTER,
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
141 texture_filters[min_filter]);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
142 glTexParameteri(tex[i].target, GL_TEXTURE_MAG_FILTER,
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
143 texture_filters[mag_filter]);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
144 asc_dprintf("Initialized texture: %u", tex[i].tex_id);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
145 }
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
146
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
147 // TODO: proper error handling for each gl call
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
148 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
149 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
150
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
151 void asc_texture_destroy(AscTexture *tex, unsigned count) {
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
152 GLuint textures[count];
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
153 for (unsigned i = 0; i < count; ++i) {
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
154 if (tex[i].refcount > 0) {
92
78ce93fb46e5 apply new logging macros
Mike Becker <universe@uap-core.de>
parents: 91
diff changeset
155 asc_wprintf("Texture %u still in use by %u objects.",
89
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
156 tex[i].tex_id, tex[i].refcount);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
157 }
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
158 asc_dprintf("Destroy texture: %u", tex[i].tex_id);
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
159 textures[i] = tex[i].tex_id;
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
160 memset(&tex[i], 0, sizeof(AscTexture));
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
161 }
e1f682a8a145 use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents: 88
diff changeset
162 glDeleteTextures(count, textures);
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
163 }
117
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
164
168
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
165 bool asc_texture_is_uv_normalized(const AscTexture *tex) {
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
166 return tex->target != GL_TEXTURE_RECTANGLE;
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
167 }
f70569c49c24 add abstractions that allow removing dependencies to glew.h
Mike Becker <universe@uap-core.de>
parents: 149
diff changeset
168
117
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
169 asc_vec2f asc_texture_calculate_uv_scale(const AscTexture *tex, asc_vec2u surface_dimension, asc_vec2f factors) {
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
170 if (surface_dimension.width == 0 || surface_dimension.height == 0) {
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
171 asc_wprintf("Tried to calculate UV scale for texture %u with zero dimensions.", tex->tex_id);
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
172 return factors;
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
173 }
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
174 asc_vec2f uv_scale = factors;
135
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
175 // non-normalized coordinates for rectangle textures
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
176 if (tex->target == GL_TEXTURE_RECTANGLE) {
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
177 uv_scale.x *= (float) tex->width;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
178 uv_scale.y *= (float) tex->height;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
179 }
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
180 // apply scaling
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
181 if (surface_dimension.width != tex->width) {
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
182 uv_scale.u *= (float) surface_dimension.width;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
183 uv_scale.u /= (float) tex->width;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
184 }
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
185 if (surface_dimension.height != tex->height) {
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
186 uv_scale.v *= (float) surface_dimension.height;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
187 uv_scale.v /= (float) tex->height;
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
188 }
062703d3f5cc remove the need for a second pair of texture coordinates
Mike Becker <universe@uap-core.de>
parents: 126
diff changeset
189
117
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
190 return uv_scale;
d1267f656a97 implement texture scaling
Mike Becker <universe@uap-core.de>
parents: 106
diff changeset
191 }

mercurial