add custom Materials
parent
927f63adf0
commit
2e5659a04a
@ -0,0 +1,25 @@
|
|||||||
|
package eu.jonahbauer.raytracing.material;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Ray;
|
||||||
|
import eu.jonahbauer.raytracing.math.Vec3;
|
||||||
|
import eu.jonahbauer.raytracing.render.Color;
|
||||||
|
import eu.jonahbauer.raytracing.scene.HitResult;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public record LambertianMaterial(@NotNull Color albedo) implements Material {
|
||||||
|
public LambertianMaterial {
|
||||||
|
Objects.requireNonNull(albedo, "albedo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Optional<ScatterResult> scatter(@NotNull Ray ray, @NotNull HitResult hit) {
|
||||||
|
var newDirection = hit.normal().plus(Vec3.random(true));
|
||||||
|
if (newDirection.isNearZero()) newDirection = hit.normal();
|
||||||
|
|
||||||
|
var scattered = new Ray(hit.position(), newDirection);
|
||||||
|
return Optional.of(new ScatterResult(scattered, albedo));
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,21 @@
|
|||||||
|
package eu.jonahbauer.raytracing.material;
|
||||||
|
|
||||||
|
import eu.jonahbauer.raytracing.math.Ray;
|
||||||
|
import eu.jonahbauer.raytracing.render.Color;
|
||||||
|
import eu.jonahbauer.raytracing.scene.HitResult;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public interface Material {
|
||||||
|
|
||||||
|
@NotNull Optional<ScatterResult> scatter(@NotNull Ray ray, @NotNull HitResult hit);
|
||||||
|
|
||||||
|
record ScatterResult(@NotNull Ray ray, @NotNull Color attenuation) {
|
||||||
|
public ScatterResult {
|
||||||
|
Objects.requireNonNull(ray, "ray");
|
||||||
|
Objects.requireNonNull(attenuation, "attenuation");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue