src/texture.c

Sat, 19 Apr 2025 15:06:24 +0200

author
Mike Becker <universe@uap-core.de>
date
Sat, 19 Apr 2025 15:06:24 +0200
changeset 86
943bf9d7c6d6
parent 85
f51eec4e7ccb
child 88
6234b7ea48f3
permissions
-rw-r--r--

make asset paths configurable

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
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
28 #include "ascension/texture.h"
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
29 #include "ascension/error.h"
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
30
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
31 #include <assert.h>
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
32 #include <GL/glew.h>
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
33
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
34 void asc_texture_bind(AscTexture const *tex, int uniform_location, int unit) {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
35 glActiveTexture(GL_TEXTURE0 + unit);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
36 GLenum error = glGetError();
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
37 if (error == GL_INVALID_ENUM) {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
38 asc_error("Tried to use more texture units than available.");
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
39 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
40 glBindTexture(tex->target, tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
41 glUniform1i(uniform_location, unit);
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
42 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
43 }
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 void asc_texture_from_surface(AscTexture *tex, SDL_Surface const *surface) {
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
46 if (asc_texture_uninitialized(tex)) {
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
47 asc_error("Tried to use uninitialized texture.");
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
48 asc_dprintf("Texture address: %"PRIxPTR, (uintptr_t) tex);
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
49 return;
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
50 }
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
51 glBindTexture(tex->target,tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
52 glPixelStorei(GL_UNPACK_ROW_LENGTH,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
53 surface->pitch / surface->format->BytesPerPixel);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
54 glTexImage2D(tex->target, 0, GL_RGBA,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
55 surface->w, surface->h,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
56 0, GL_BGRA,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
57 GL_UNSIGNED_BYTE, surface->pixels);
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
58 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
59 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
60
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
61 void asc_texture_init(
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
62 AscTexture *tex,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
63 enum asc_texture_target target,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
64 enum asc_texture_min_filter min_filter,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
65 enum asc_texture_mag_filter mag_filter
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
66 ) {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
67 static const GLenum texture_targets[] = {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
68 GL_TEXTURE_RECTANGLE
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
69 };
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
70 static const GLint texture_filters[] = {
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
71 GL_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
72 GL_LINEAR,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
73 GL_NEAREST_MIPMAP_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
74 GL_LINEAR_MIPMAP_NEAREST,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
75 GL_NEAREST_MIPMAP_LINEAR,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
76 GL_LINEAR_MIPMAP_LINEAR
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
77 };
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
78 assert(target < sizeof(texture_targets) / sizeof(GLenum));
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
79 assert(min_filter < sizeof(texture_filters) / sizeof(GLint));
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
80 assert(mag_filter < 2); // mag filter only supports nearest/linear
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
81 tex->target = texture_targets[target];
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
82 glGenTextures(1, &tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
83 glBindTexture(tex->target, tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
84 glTexParameteri(tex->target, GL_TEXTURE_MIN_FILTER,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
85 texture_filters[min_filter]);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
86 glTexParameteri(tex->target, GL_TEXTURE_MAG_FILTER,
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
87 texture_filters[mag_filter]);
85
f51eec4e7ccb fix debug output
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
88 asc_dprintf("Initialized texture: %u", tex->tex_id);
86
943bf9d7c6d6 make asset paths configurable
Mike Becker <universe@uap-core.de>
parents: 85
diff changeset
89 asc_error_catch_all_gl();
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
90 }
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
91
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
92 void asc_texture_destroy(AscTexture *tex) {
85
f51eec4e7ccb fix debug output
Mike Becker <universe@uap-core.de>
parents: 50
diff changeset
93 asc_dprintf("Destroy texture: %u", tex->tex_id);
50
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
94 glDeleteTextures(1, &tex->tex_id);
d8d2e4817db1 add texture.h
Mike Becker <universe@uap-core.de>
parents:
diff changeset
95 }

mercurial