Search in sources :

Example 41 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class BanchoffSurface method prepareShadingState.

@Override
public void prepareShadingState(ShadingState state) {
    state.init();
    state.getRay().getPoint(state.getPoint());
    Instance parent = state.getInstance();
    Point3 n = state.transformWorldToObject(state.getPoint());
    state.getNormal().set(n.x * (2 * n.x * n.x - 1), n.y * (2 * n.y * n.y - 1), n.z * (2 * n.z * n.z - 1));
    state.getNormal().normalize();
    state.setShader(parent.getShader(0));
    state.setModifier(parent.getModifier(0));
    // into world space
    Vector3 worldNormal = state.transformNormalObjectToWorld(state.getNormal());
    state.getNormal().set(worldNormal);
    state.getNormal().normalize();
    state.getGeoNormal().set(state.getNormal());
    // create basis in world space
    state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal()));
}
Also used : Point3(org.sunflow.math.Point3) Instance(org.sunflow.core.Instance) Vector3(org.sunflow.math.Vector3)

Example 42 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class AnisotropicWardShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    // make sure we are on the right side of the material
    state.faceforward();
    Color d = getDiffuse(state);
    state.storePhoton(state.getRay().getDirection(), power, d);
    float avgD = d.getAverage();
    float avgS = rhoS.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < avgD) {
        // photon is scattered diffusely
        power.mul(d).mul(1.0f / avgD);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * rnd / avgD;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.sqrt(v);
        float s1 = (float) Math.sqrt(1.0f - v);
        Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
        w = onb.transform(w, new Vector3());
        state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
    } else if (rnd < avgD + avgS) {
        // photon is scattered specularly
        power.mul(rhoS).mul(1 / avgS);
        OrthoNormalBasis basis = state.getBasis();
        Vector3 in = state.getRay().getDirection().negate(new Vector3());
        double r1 = rnd / avgS;
        double r2 = state.getRandom(0, 1, 1);
        float alphaRatio = alphaY / alphaX;
        float phi = 0;
        if (r1 < 0.25) {
            double val = 4 * r1;
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
        } else if (r1 < 0.5) {
            double val = 1 - 4 * (0.5 - r1);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi = (float) Math.PI - phi;
        } else if (r1 < 0.75) {
            double val = 4 * (r1 - 0.5);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi += Math.PI;
        } else {
            double val = 1 - 4 * (1 - r1);
            phi = (float) Math.atan(alphaRatio * Math.tan(Math.PI / 2 * val));
            phi = 2 * (float) Math.PI - phi;
        }
        float cosPhi = (float) Math.cos(phi);
        float sinPhi = (float) Math.sin(phi);
        float denom = (cosPhi * cosPhi) / (alphaX * alphaX) + (sinPhi * sinPhi) / (alphaY * alphaY);
        float theta = (float) Math.atan(Math.sqrt(-Math.log(1 - r2) / denom));
        float sinTheta = (float) Math.sin(theta);
        float cosTheta = (float) Math.cos(theta);
        Vector3 h = new Vector3();
        h.x = sinTheta * cosPhi;
        h.y = sinTheta * sinPhi;
        h.z = cosTheta;
        basis.transform(h);
        Vector3 o = new Vector3();
        float ih = Vector3.dot(h, in);
        o.x = 2 * ih * h.x - in.x;
        o.y = 2 * ih * h.y - in.y;
        o.z = 2 * ih * h.z - in.z;
        Ray r = new Ray(state.getPoint(), o);
        state.traceReflectionPhoton(r, power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 43 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class DiffuseShader method scatterPhoton.

public void scatterPhoton(ShadingState state, Color power) {
    Color diffuse;
    // make sure we are on the right side of the material
    if (Vector3.dot(state.getNormal(), state.getRay().getDirection()) > 0.0) {
        state.getNormal().negate();
        state.getGeoNormal().negate();
    }
    diffuse = getDiffuse(state);
    state.storePhoton(state.getRay().getDirection(), power, diffuse);
    float avg = diffuse.getAverage();
    double rnd = state.getRandom(0, 0, 1);
    if (rnd < avg) {
        // photon is scattered
        power.mul(diffuse).mul(1.0f / avg);
        OrthoNormalBasis onb = state.getBasis();
        double u = 2 * Math.PI * rnd / avg;
        double v = state.getRandom(0, 1, 1);
        float s = (float) Math.sqrt(v);
        float s1 = (float) Math.sqrt(1.0 - v);
        Vector3 w = new Vector3((float) Math.cos(u) * s, (float) Math.sin(u) * s, s1);
        w = onb.transform(w, new Vector3());
        state.traceDiffusePhoton(new Ray(state.getPoint(), w), power);
    }
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 44 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class IDShader method getRadiance.

public Color getRadiance(ShadingState state) {
    Vector3 n = state.getNormal();
    float f = n == null ? 1.0f : Math.abs(state.getRay().dot(n));
    return new Color(state.getInstance().hashCode()).mul(f);
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3)

Example 45 with Vector3

use of org.sunflow.math.Vector3 in project joons-renderer by joonhyublee.

the class PrimIDShader method getRadiance.

public Color getRadiance(ShadingState state) {
    Vector3 n = state.getNormal();
    float f = n == null ? 1.0f : Math.abs(state.getRay().dot(n));
    return BORDERS[state.getPrimitiveID() % BORDERS.length].copy().mul(f);
}
Also used : Vector3(org.sunflow.math.Vector3)

Aggregations

Vector3 (org.sunflow.math.Vector3)75 Color (org.sunflow.image.Color)34 Point3 (org.sunflow.math.Point3)27 Ray (org.sunflow.core.Ray)25 OrthoNormalBasis (org.sunflow.math.OrthoNormalBasis)17 Instance (org.sunflow.core.Instance)11 LightSample (org.sunflow.core.LightSample)8 ShadingState (org.sunflow.core.ShadingState)3 ParameterList (org.sunflow.core.ParameterList)2 TriangleMesh (org.sunflow.core.primitive.TriangleMesh)2 XYZColor (org.sunflow.image.XYZColor)2 Timer (org.sunflow.system.Timer)2 File (java.io.File)1 FileInputStream (java.io.FileInputStream)1 FileNotFoundException (java.io.FileNotFoundException)1 IOException (java.io.IOException)1 FloatBuffer (java.nio.FloatBuffer)1 MappedByteBuffer (java.nio.MappedByteBuffer)1 ReentrantReadWriteLock (java.util.concurrent.locks.ReentrantReadWriteLock)1 PrimitiveList (org.sunflow.core.PrimitiveList)1