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