Fri, 13 Jun 2025 17:45:19 +0200
compute frame time before syncing to avoid div-by-zero in first frame
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 | ||
28 | #ifndef ASCENSION_TEXTURE_H | |
29 | #define ASCENSION_TEXTURE_H | |
30 | ||
117
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
31 | #include "datatypes.h" |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
32 | |
50 | 33 | #include <SDL2/SDL_surface.h> |
34 | ||
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
35 | typedef struct asc_texture_s { |
144
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
125
diff
changeset
|
36 | /** |
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
125
diff
changeset
|
37 | * OpenGL texture target. |
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
125
diff
changeset
|
38 | * Not to be confused with asc_texture_target! |
43636d6a6e25
do not try to use one distinct render group for each different shader
Mike Becker <universe@uap-core.de>
parents:
125
diff
changeset
|
39 | */ |
50 | 40 | unsigned target; |
41 | unsigned tex_id; | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
42 | unsigned width; |
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
43 | unsigned height; |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
44 | unsigned refcount; |
117
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
45 | // TODO: add support for texture atlas - idea: rects are defined in AscTexture and can be indexed |
145
a3231310d66d
consistent naming of structs and their typedefs
Mike Becker <universe@uap-core.de>
parents:
144
diff
changeset
|
46 | } AscTexture; |
50 | 47 | |
48 | enum asc_texture_target { | |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
49 | ASC_TEXTURE_RECTANGLE, |
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
50 | ASC_TEXTURE_2D |
50 | 51 | }; |
52 | ||
53 | enum asc_texture_min_filter { | |
54 | ASC_TEXTURE_MIN_FILTER_NEAREST, | |
55 | ASC_TEXTURE_MIN_FILTER_LINEAR, | |
56 | ASC_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_NEAREST, | |
57 | ASC_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_NEAREST, | |
58 | ASC_TEXTURE_MIN_FILTER_NEAREST_MIPMAP_LINEAR, | |
59 | ASC_TEXTURE_MIN_FILTER_LINEAR_MIPMAP_LINEAR | |
60 | }; | |
61 | ||
62 | enum asc_texture_mag_filter { | |
63 | ASC_TEXTURE_MAG_FILTER_NEAREST, | |
64 | ASC_TEXTURE_MAG_FILTER_LINEAR | |
65 | }; | |
66 | ||
117
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
67 | enum asc_texture_scale_mode { |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
68 | ASC_TEXTURE_SCALE_FIT, |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
69 | ASC_TEXTURE_SCALE_REPEAT |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
70 | }; |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
71 | |
50 | 72 | void asc_texture_init( |
73 | 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
|
74 | unsigned count, |
50 | 75 | enum asc_texture_target target, |
76 | enum asc_texture_min_filter min_filter, | |
77 | enum asc_texture_mag_filter mag_filter | |
78 | ); | |
79 | ||
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
80 | void asc_texture_destroy(AscTexture *tex, unsigned count); |
50 | 81 | |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
82 | #define asc_texture_init_rectangle(tex, count) \ |
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
83 | asc_texture_init(tex, count, ASC_TEXTURE_RECTANGLE, \ |
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
84 | ASC_TEXTURE_MIN_FILTER_NEAREST, ASC_TEXTURE_MAG_FILTER_NEAREST) |
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
85 | |
89
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
86 | #define asc_texture_init_2d(tex, count) \ |
e1f682a8a145
use refcounted objects for textures instead of pass-by-value int structs
Mike Becker <universe@uap-core.de>
parents:
88
diff
changeset
|
87 | asc_texture_init(tex, count, ASC_TEXTURE_2D, \ |
50 | 88 | ASC_TEXTURE_MIN_FILTER_LINEAR, ASC_TEXTURE_MAG_FILTER_LINEAR) |
89 | ||
90 | void asc_texture_bind(AscTexture const *tex, int uniform_location, int unit); | |
91 | ||
92 | void asc_texture_from_surface(AscTexture *tex, SDL_Surface const *surface); | |
93 | ||
88
6234b7ea48f3
add support for 2d textures in sprite shader - fixes #386
Mike Becker <universe@uap-core.de>
parents:
50
diff
changeset
|
94 | 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:
50
diff
changeset
|
95 | |
117
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
96 | |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
97 | /** |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
98 | * Calculates UV scaling factors depending on texture and surface dimensions. |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
99 | * |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
100 | * @param tex the texture |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
101 | * @param surface_dimension the dimensions of the surface the texture is applied to |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
102 | * @param factors additional scaling factors |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
103 | * @return the calculated UV scaling factors |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
104 | */ |
d1267f656a97
implement texture scaling
Mike Becker <universe@uap-core.de>
parents:
89
diff
changeset
|
105 | 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:
89
diff
changeset
|
106 | |
50 | 107 | #endif //ASCENSION_TEXTURE_H |