All Downloads are FREE. Search and download functionalities are using the official Maven repository.

se.llbit.chunky.resources.AbstractHdriTexture Maven / Gradle / Ivy

There is a newer version: 1.4.5
Show newest version
/* Copyright (c) 2014 Jesper Öqvist 
 *
 * This file is part of Chunky.
 *
 * Chunky is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Chunky is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * You should have received a copy of the GNU General Public License
 * along with Chunky.  If not, see .
 */
package se.llbit.chunky.resources;

import se.llbit.math.Vector4;

public class AbstractHdriTexture extends Texture {
  public float[] buf;

  @Override public void getColorInterpolated(double u, double v, Vector4 sample) {
    double x = width * u;
    double y = height * v;
    int x0 = clamp(floor(x), width);
    int x1 = clamp(ceil(x), width);
    int y0 = clamp(floor(y), height);
    int y1 = clamp(ceil(y), height);
    double xw = 1 - x + x0;
    double yw = 1 - y + y0;
    int offset = (y0 * width + x0) * 3;
    double r0 = buf[offset + 0];
    double g0 = buf[offset + 1];
    double b0 = buf[offset + 2];
    offset = (y0 * width + x1) * 3;
    double r1 = buf[offset + 0];
    double g1 = buf[offset + 1];
    double b1 = buf[offset + 2];
    offset = (y1 * width + x0) * 3;
    double r2 = buf[offset + 0];
    double g2 = buf[offset + 1];
    double b2 = buf[offset + 2];
    offset = (y1 * width + x1) * 3;
    double r3 = buf[offset + 0];
    double g3 = buf[offset + 1];
    double b3 = buf[offset + 2];
    sample.set(r0 * xw * yw + r1 * (1 - xw) * yw + r2 * xw * (1 - yw) + r3 * (1 - xw) * (1 - yw),
        g0 * xw * yw + g1 * (1 - xw) * yw + g2 * xw * (1 - yw) + g3 * (1 - xw) * (1 - yw),
        b0 * xw * yw + b1 * (1 - xw) * yw + b2 * xw * (1 - yw) + b3 * (1 - xw) * (1 - yw), 1);
  }

  @Override public void getColor(double u, double v, Vector4 c) {
    int x = (int) (width * u);
    int y = (int) (height * v);
    x = (x < 0) ? 0 : (x >= width) ? width - 1 : x;
    y = (y < 0) ? 0 : (y >= height) ? height - 1 : y;
    int offset = (y * width + x) * 3;
    c.set(buf[offset + 0], buf[offset + 1], buf[offset + 2], 1);
  }

  /**
   * Clamp image coordinate.
   */
  private static int clamp(int i, int end) {
    return i < 0 ? 0 : (i >= end ? end - 1 : i);
  }

  private static int floor(double d) {
    int i = (int) d;
    return d < i ? i - 1 : i;
  }

  private static int ceil(double d) {
    int i = (int) d;
    return d > i ? i + 1 : i;
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy