137
internal static int UseTexture(int TextureIndex) {
138
switch(RegisteredTextures[TextureIndex].Status) {
139
case TextureStatus.NotLoaded:
141
LoadTextureRawData(TextureIndex);
142
SubmitRawDataToOpenGl(TextureIndex);
143
return RegisteredTextures[TextureIndex].OpenGlTextureIndex;
144
case TextureStatus.Scheduled:
145
// scheduled - wait for the background worker to complete loading
146
while (RegisteredTextures[TextureIndex].Status == TextureStatus.Scheduled) {
147
System.Threading.Thread.Sleep(0);
177
/// <summary>Loads a registered texture immediately or via the background worker.</summary>
178
/// <param name="textureIndex">The index of the registered texture.</param>
179
/// <param name="loadImmediately">Whether to load the texture immediately or via the background worker.</param>
180
internal static void LoadTexture(int textureIndex, bool loadImmediately) {
181
if (loadImmediately) {
182
switch(RegisteredTextures[textureIndex].Status) {
183
case TextureStatus.NotLoaded:
185
LoadTextureRawData(textureIndex);
186
SubmitRawDataToOpenGl(textureIndex, true);
187
RegisteredTextures[textureIndex].Status = TextureStatus.Loaded;
189
case TextureStatus.Scheduled:
190
// scheduled - wait for the background worker to complete loading
191
while (RegisteredTextures[textureIndex].Status != TextureStatus.Finalizing) {
192
System.Threading.Thread.Sleep(0);
194
SubmitRawDataToOpenGl(textureIndex, true);
196
case TextureStatus.Finalizing:
198
SubmitRawDataToOpenGl(textureIndex, true);
199
RegisteredTextures[textureIndex].Status = TextureStatus.Loaded;
203
throw new NotImplementedException("This operation cannot be performed because the background worker is not yet implemented.");
205
if (RegisteredTextures[textureIndex].Status == TextureStatus.NotLoaded) {
206
// let the background worker load the texture
207
RegisteredTextures[textureIndex].Status = TextureStatus.Scheduled;
149
SubmitRawDataToOpenGl(TextureIndex);
150
return RegisteredTextures[TextureIndex].OpenGlTextureIndex;
151
case TextureStatus.Finalizing:
153
SubmitRawDataToOpenGl(TextureIndex);
154
return RegisteredTextures[TextureIndex].OpenGlTextureIndex;
155
case TextureStatus.Loaded:
157
return RegisteredTextures[TextureIndex].OpenGlTextureIndex;
160
// invalid texture status
161
throw new InvalidOperationException();
213
// get opengl texture index
214
/// <summary>Gets the OpenGL texture index for a registered texture provided that the texture has been loaded into OpenGL.</summary>
215
/// <param name="textureIndex">The index of the registered texture.</param>
216
/// <param name="openGlTextureIndex">Receives the OpenGL texture index.</param>
217
/// <returns>A boolean indicating the success of the operation.</returns>
218
internal static bool GetOpenGlTextureIndex(int textureIndex, out int openGlTextureIndex) {
219
if (RegisteredTextures[textureIndex].Status == TextureStatus.Loaded) {
220
openGlTextureIndex = RegisteredTextures[textureIndex].OpenGlTextureIndex;
223
openGlTextureIndex = 0;
165
228
// load texture raw data
166
/// <summary>Loads the raw data of a registered texture. The texture status must be NeverLoaded, Queried or Unloaded.</summary>
229
/// <summary>Loads the raw data of a registered texture. The texture status must be NotLoaded or Scheduled.</summary>
167
230
/// <param name="TextureIndex">The index to the registered texture.</param>
168
/// <exception cref="InvalidOperationException">Raised when the status of the registered texture is not NeverLoaded, Queried or Unloaded.</exception>
231
/// <exception cref="InvalidOperationException">Raised when the status of the registered texture is neither NotLoaded nor Scheduled.</exception>
169
232
/// <remarks>When this operation completes, the status of the registered texture is set to Finalizing.</remarks>
170
internal static void LoadTextureRawData(int TextureIndex) {
233
internal static void LoadTextureRawData(int textureIndex) {
172
RegisteredTextures[TextureIndex].Status == TextureStatus.NotLoaded |
173
RegisteredTextures[TextureIndex].Status == TextureStatus.Scheduled
235
RegisteredTextures[textureIndex].Status == TextureStatus.NotLoaded |
236
RegisteredTextures[textureIndex].Status == TextureStatus.Scheduled
176
OpenBveApi.General.Origin origin = RegisteredTextures[TextureIndex].Origin;
177
OpenBveApi.Texture.TextureParameters parameters = RegisteredTextures[TextureIndex].Parameters;
239
OpenBveApi.General.Origin origin = RegisteredTextures[textureIndex].Origin;
240
OpenBveApi.Texture.TextureParameters parameters = RegisteredTextures[textureIndex].Parameters;
178
241
OpenBveApi.Texture.TextureData texture;
179
Interfaces.Host10.LoadTexture(origin, out texture);
180
// convert to 8 bits per channel
182
ConvertTo8BitsPerChannel(texture, out raw);
183
int width = texture.Format.Width;
184
int height = texture.Format.Height;
186
if (parameters.ClipRegion != null) {
187
ExtractClipRegion(ref width, ref height, ref raw, parameters.ClipRegion);
189
// remove transparent color
190
if (parameters.TransparentColor.Assigned) {
242
if (Interfaces.Host10.LoadTexture(origin, out texture) == OpenBveApi.General.Result.Successful) {
243
// convert to 8 bits per channel
245
ConvertTo8BitsPerChannel(texture, out raw);
246
int width = texture.Format.Width;
247
int height = texture.Format.Height;
249
if (parameters.ClipRegion != null) {
250
ExtractClipRegion(ref width, ref height, ref raw, parameters.ClipRegion);
252
// eliminate transparent color
191
253
EliminateTransparentColor(width, height, ref raw, parameters.TransparentColor);
254
// convert to power-of-two
255
ConvertToPowerOfTwoSize(ref width, ref height, ref raw);
256
// determine texture type
257
RegisteredTextures[textureIndex].Type = DetermineTextureType(width, height, raw);
259
RegisteredTextures[textureIndex].RawWidth = width;
260
RegisteredTextures[textureIndex].RawHeight = height;
261
RegisteredTextures[textureIndex].RawData = raw;
262
RegisteredTextures[textureIndex].Status = TextureStatus.Finalizing;
265
RegisteredTextures[textureIndex].Type = TextureType.Opaque;
266
RegisteredTextures[textureIndex].RawWidth = 32;
267
RegisteredTextures[textureIndex].RawHeight = 8;
268
RegisteredTextures[textureIndex].RawData = new byte[] {
269
/* white "error" on red background */
270
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
271
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
272
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
273
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
274
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
275
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
276
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF,
277
0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0xFF
279
RegisteredTextures[textureIndex].Status = TextureStatus.Finalizing;
193
// convert to power-of-two
194
ConvertToPowerOfTwoSize(ref width, ref height, ref raw);
196
RegisteredTextures[TextureIndex].RawWidth = width;
197
RegisteredTextures[TextureIndex].RawHeight = height;
198
RegisteredTextures[TextureIndex].RawData = raw;
199
RegisteredTextures[TextureIndex].Status = TextureStatus.Finalizing;
201
282
// invalid texture status
202
283
throw new InvalidOperationException();
206
287
// submit raw data to opengl
207
288
/// <summary>Submits the raw data of a registered texture to OpenGL. The texture status must be Finalizing.</summary>
208
/// <param name="TextureIndex">The index to the registered texture.</param>
209
/// <exception cref="InvalidOperationException">Raised when the status of the registered texture is not Finalizing.</exception>
210
/// <remarks>When this operation completes, the status of the registered texture is set to Loaded.</remarks>
211
internal static void SubmitRawDataToOpenGl(int TextureIndex) {
289
/// <param name="textureIndex">The index to the registered texture.</param>
290
/// <param name="respectQuality">Whether to respect the global texture quality setting. If set to False, bilinear filtering is used without mipmapping.</param>
291
internal static void SubmitRawDataToOpenGl(int textureIndex, bool respectQuality) {
212
292
int[] names = new int[1];
213
293
Gl.glGenTextures(1, names);
214
RegisteredTextures[TextureIndex].OpenGlTextureIndex = names[0];
215
Gl.glBindTexture(Gl.GL_TEXTURE_2D, RegisteredTextures[TextureIndex].OpenGlTextureIndex);
218
// TODO: Implement this.
220
// switch (Options.CurrentOptions.TextureInterpolationMode) {
221
// case Options.TextureInterpolationMode.NearestNeighbor:
222
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
223
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
225
// case Options.TextureInterpolationMode.NearestNeighborMipmapping:
226
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST_MIPMAP_NEAREST);
227
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
229
// case Options.TextureInterpolationMode.Bilinear:
230
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
231
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
233
// case Options.TextureInterpolationMode.BilinearMipmapping:
234
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST_MIPMAP_LINEAR);
235
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
237
// case Options.TextureInterpolationMode.Trilinear:
238
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);
239
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
242
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);
243
// Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
246
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
247
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
250
if (RegisteredTextures[TextureIndex].Parameters.HorizontalWrapMode == OpenBveApi.Texture.TextureWrapMode.ClampToEdge) {
294
RegisteredTextures[textureIndex].OpenGlTextureIndex = names[0];
295
Gl.glBindTexture(Gl.GL_TEXTURE_2D, names[0]);
296
if (respectQuality) {
297
switch (Program.CurrentOptions.InterpolationMode) {
298
case Options.TextureInterpolationMode.NearestNeighbor:
299
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
300
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
302
case Options.TextureInterpolationMode.NearestNeighborMipmapped:
303
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST_MIPMAP_NEAREST);
304
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
306
case Options.TextureInterpolationMode.Bilinear:
307
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR);
308
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
310
case Options.TextureInterpolationMode.BilinearMipmapped:
311
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST_MIPMAP_LINEAR);
312
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
314
case Options.TextureInterpolationMode.TrilinearMipmapped:
315
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);
316
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
319
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_LINEAR_MIPMAP_LINEAR);
320
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_LINEAR);
324
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MIN_FILTER, Gl.GL_NEAREST);
325
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAG_FILTER, Gl.GL_NEAREST);
327
if (Program.CurrentOptions.InterpolationMode == Options.TextureInterpolationMode.AnisotropicFiltering & Program.AnisotropicMaximum != 0.0f) {
328
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_ANISOTROPY_EXT, Program.AnisotropicMaximum);
333
if (RegisteredTextures[textureIndex].Parameters.HorizontalWrapMode == OpenBveApi.Texture.TextureWrapMode.ClampToEdge) {
251
334
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_CLAMP_TO_EDGE);
253
336
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_S, Gl.GL_REPEAT);
255
if (RegisteredTextures[TextureIndex].Parameters.VerticalWrapMode == OpenBveApi.Texture.TextureWrapMode.ClampToEdge) {
338
if (RegisteredTextures[textureIndex].Parameters.VerticalWrapMode == OpenBveApi.Texture.TextureWrapMode.ClampToEdge) {
256
339
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_CLAMP_TO_EDGE);
258
341
Gl.glTexParameterf(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_WRAP_T, Gl.GL_REPEAT);
261
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_GENERATE_MIPMAP, Gl.GL_TRUE);
262
int width = RegisteredTextures[TextureIndex].RawWidth;
263
int height = RegisteredTextures[TextureIndex].RawHeight;
264
byte[] raw = RegisteredTextures[TextureIndex].RawData;
265
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height, 0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, raw);
344
* Submit the texture to OpenGL.
346
if (respectQuality) {
347
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_GENERATE_MIPMAP, Gl.GL_TRUE);
349
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_GENERATE_MIPMAP, Gl.GL_TRUE);
351
int width = RegisteredTextures[textureIndex].RawWidth;
352
int height = RegisteredTextures[textureIndex].RawHeight;
353
byte[] raw = RegisteredTextures[textureIndex].RawData;
354
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, width, height, 0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, raw);