Search in sources :

Example 16 with Vector3

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

the class Hair method getTangent.

private Vector3 getTangent(int line, int v0, float v) {
    Vector3 vcurr = new Vector3(points[v0 + 3] - points[v0 + 0], points[v0 + 4] - points[v0 + 1], points[v0 + 5] - points[v0 + 2]);
    vcurr.normalize();
    if (line == 0 || line == numSegments - 1) {
        return vcurr;
    }
    if (v <= 0.5f) {
        // get previous segment
        Vector3 vprev = new Vector3(points[v0 + 0] - points[v0 - 3], points[v0 + 1] - points[v0 - 2], points[v0 + 2] - points[v0 - 1]);
        vprev.normalize();
        float t = v + 0.5f;
        float s = 1 - t;
        float vx = vprev.x * s + vcurr.x * t;
        float vy = vprev.y * s + vcurr.y * t;
        float vz = vprev.z * s + vcurr.z * t;
        return new Vector3(vx, vy, vz);
    } else {
        // get next segment
        v0 += 3;
        Vector3 vnext = new Vector3(points[v0 + 3] - points[v0 + 0], points[v0 + 4] - points[v0 + 1], points[v0 + 5] - points[v0 + 2]);
        vnext.normalize();
        float t = 1.5f - v;
        float s = 1 - t;
        float vx = vnext.x * s + vcurr.x * t;
        float vy = vnext.y * s + vcurr.y * t;
        float vz = vnext.z * s + vcurr.z * t;
        return new Vector3(vx, vy, vz);
    }
}
Also used : Vector3(org.sunflow.math.Vector3)

Example 17 with Vector3

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

the class Hair method getRadiance.

@Override
public Color getRadiance(ShadingState state) {
    // don't use these - gather lights for sphere of directions
    // gather lights
    state.initLightSamples();
    state.initCausticSamples();
    Vector3 v = state.getRay().getDirection();
    v.negate();
    Vector3 h = new Vector3();
    Vector3 t = state.getBasis().transform(new Vector3(0, 1, 0));
    Color diff = Color.black();
    Color spec = Color.black();
    for (LightSample ls : state) {
        Vector3 l = ls.getShadowRay().getDirection();
        float dotTL = Vector3.dot(t, l);
        float sinTL = (float) Math.sqrt(1 - dotTL * dotTL);
        // float dotVL = Vector3.dot(v, l);
        diff.madd(sinTL, ls.getDiffuseRadiance());
        Vector3.add(v, l, h);
        h.normalize();
        float dotTH = Vector3.dot(t, h);
        float sinTH = (float) Math.sqrt(1 - dotTH * dotTH);
        float s = (float) Math.pow(sinTH, 10.0f);
        spec.madd(s, ls.getSpecularRadiance());
    }
    Color c = Color.add(diff, spec, new Color());
    // transparency
    return Color.blend(c, state.traceTransparency(), state.getV(), new Color());
}
Also used : LightSample(org.sunflow.core.LightSample) Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3)

Example 18 with Vector3

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

the class ParticleSurface method prepareShadingState.

@Override
public void prepareShadingState(ShadingState state) {
    state.init();
    state.getRay().getPoint(state.getPoint());
    Point3 localPoint = state.transformWorldToObject(state.getPoint());
    localPoint.x -= particles[3 * state.getPrimitiveID() + 0];
    localPoint.y -= particles[3 * state.getPrimitiveID() + 1];
    localPoint.z -= particles[3 * state.getPrimitiveID() + 2];
    state.getNormal().set(localPoint.x, localPoint.y, localPoint.z);
    state.getNormal().normalize();
    state.setShader(state.getInstance().getShader(0));
    state.setModifier(state.getInstance().getModifier(0));
    // into object space
    Vector3 worldNormal = state.transformNormalObjectToWorld(state.getNormal());
    state.getNormal().set(worldNormal);
    state.getNormal().normalize();
    state.getGeoNormal().set(state.getNormal());
    state.setBasis(OrthoNormalBasis.makeFromW(state.getNormal()));
}
Also used : Point3(org.sunflow.math.Point3) Vector3(org.sunflow.math.Vector3)

Example 19 with Vector3

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

the class AmbientOcclusionGIEngine method getIrradiance.

@Override
public Color getIrradiance(ShadingState state, Color diffuseReflectance) {
    OrthoNormalBasis onb = state.getBasis();
    Vector3 w = new Vector3();
    Color result = Color.black();
    for (int i = 0; i < samples; i++) {
        float xi = (float) state.getRandom(i, 0, samples);
        float xj = (float) state.getRandom(i, 1, samples);
        float phi = (float) (2 * Math.PI * xi);
        float cosPhi = (float) Math.cos(phi);
        float sinPhi = (float) Math.sin(phi);
        float sinTheta = (float) Math.sqrt(xj);
        float cosTheta = (float) Math.sqrt(1.0f - xj);
        w.x = cosPhi * sinTheta;
        w.y = sinPhi * sinTheta;
        w.z = cosTheta;
        onb.transform(w);
        Ray r = new Ray(state.getPoint(), w);
        r.setMax(maxDist);
        result.add(Color.blend(bright, dark, state.traceShadow(r)));
    }
    return result.mul((float) Math.PI / samples);
}
Also used : Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray) OrthoNormalBasis(org.sunflow.math.OrthoNormalBasis)

Example 20 with Vector3

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

the class ImageBasedLight method getSamples.

public void getSamples(ShadingState state) {
    if (samples == null) {
        int n = state.getDiffuseDepth() > 0 ? 1 : numSamples;
        for (int i = 0; i < n; i++) {
            // random offset on unit square, we use the infinite version of
            // getRandom because the light sampling is adaptive
            double randX = state.getRandom(i, 0, n);
            double randY = state.getRandom(i, 1, n);
            int x = 0;
            while (randX >= colHistogram[x] && x < colHistogram.length - 1) {
                x++;
            }
            float[] rowHistogram = imageHistogram[x];
            int y = 0;
            while (randY >= rowHistogram[y] && y < rowHistogram.length - 1) {
                y++;
            }
            // sample from (x, y)
            float u = (float) ((x == 0) ? (randX / colHistogram[0]) : ((randX - colHistogram[x - 1]) / (colHistogram[x] - colHistogram[x - 1])));
            float v = (float) ((y == 0) ? (randY / rowHistogram[0]) : ((randY - rowHistogram[y - 1]) / (rowHistogram[y] - rowHistogram[y - 1])));
            float px = ((x == 0) ? colHistogram[0] : (colHistogram[x] - colHistogram[x - 1]));
            float py = ((y == 0) ? rowHistogram[0] : (rowHistogram[y] - rowHistogram[y - 1]));
            float su = (x + u) / colHistogram.length;
            float sv = (y + v) / rowHistogram.length;
            float invP = (float) Math.sin(sv * Math.PI) * jacobian / (n * px * py);
            Vector3 dir = getDirection(su, sv);
            basis.transform(dir);
            if (Vector3.dot(dir, state.getGeoNormal()) > 0) {
                LightSample dest = new LightSample();
                dest.setShadowRay(new Ray(state.getPoint(), dir));
                dest.getShadowRay().setMax(Float.MAX_VALUE);
                Color radiance = texture.getPixel(su, sv);
                dest.setRadiance(radiance, radiance);
                dest.getDiffuseRadiance().mul(invP);
                dest.getSpecularRadiance().mul(invP);
                dest.traceShadow(state);
                state.addSample(dest);
            }
        }
    } else {
        if (state.getDiffuseDepth() > 0) {
            for (int i = 0; i < numLowSamples; i++) {
                if (Vector3.dot(lowSamples[i], state.getGeoNormal()) > 0 && Vector3.dot(lowSamples[i], state.getNormal()) > 0) {
                    LightSample dest = new LightSample();
                    dest.setShadowRay(new Ray(state.getPoint(), lowSamples[i]));
                    dest.getShadowRay().setMax(Float.MAX_VALUE);
                    dest.setRadiance(lowColors[i], lowColors[i]);
                    dest.traceShadow(state);
                    state.addSample(dest);
                }
            }
        } else {
            for (int i = 0; i < numSamples; i++) {
                if (Vector3.dot(samples[i], state.getGeoNormal()) > 0 && Vector3.dot(samples[i], state.getNormal()) > 0) {
                    LightSample dest = new LightSample();
                    dest.setShadowRay(new Ray(state.getPoint(), samples[i]));
                    dest.getShadowRay().setMax(Float.MAX_VALUE);
                    dest.setRadiance(colors[i], colors[i]);
                    dest.traceShadow(state);
                    state.addSample(dest);
                }
            }
        }
    }
}
Also used : LightSample(org.sunflow.core.LightSample) Color(org.sunflow.image.Color) Vector3(org.sunflow.math.Vector3) Ray(org.sunflow.core.Ray)

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