From 773c9a86430f0ab697abade5f1a95f38c5790372 Mon Sep 17 00:00:00 2001 From: Wenzel Jakob Date: Tue, 14 Sep 2010 02:31:28 +0200 Subject: [PATCH] Fix bug #6 and some initialization related errors --- src/converter/collada.cpp | 12 ++++++++++-- src/libhw/vpl.cpp | 1 - src/librender/scene.cpp | 2 +- src/librender/vpl.cpp | 6 +++--- 4 files changed, 14 insertions(+), 7 deletions(-) diff --git a/src/converter/collada.cpp b/src/converter/collada.cpp index e2b5bb0a..4b47bcd5 100644 --- a/src/converter/collada.cpp +++ b/src/converter/collada.cpp @@ -968,8 +968,16 @@ void loadNode(GeometryConverter *cvt, Transform transform, std::ostream &os, if (element->hasAttribute("sid") && element->getAttribute("sid") == "post-rotationY") continue; daeTArray value = daeSafeCast(element)->getValue(); - transform = transform * - Transform::rotate(Vector((Float) value.get(0), (Float) value.get(1), (Float) value.get(2)), (Float) value.get(3)); + Vector axis((Float) value.get(0), (Float) value.get(1), (Float) value.get(2)); + Float angle = (Float) value.get(3); + if (angle != 0) { + if (axis.isZero()) { + SLog(EWarn, "Encountered a rotation around a zero vector -- ignoring!"); + } else { + transform = transform * + Transform::rotate(axis, (Float) value.get(3)); + } + } } else if (element->typeID() == domTranslate::ID()) { daeTArray value = daeSafeCast(element)->getValue(); transform = transform * diff --git a/src/libhw/vpl.cpp b/src/libhw/vpl.cpp index f08dd7d1..877031a4 100644 --- a/src/libhw/vpl.cpp +++ b/src/libhw/vpl.cpp @@ -250,7 +250,6 @@ void VPLShaderManager::setVPL(const VPL &vpl) { m_shadowProgram->unbind(); } else { /* Old-fashioned: render 6 times, once for each cube map face */ - m_altShadowProgram->bind(); for (int i=0; i<6; ++i) { switch (i) { diff --git a/src/librender/scene.cpp b/src/librender/scene.cpp index 1f3915bc..5c48a63e 100644 --- a/src/librender/scene.cpp +++ b/src/librender/scene.cpp @@ -408,7 +408,7 @@ void Scene::sampleEmission(EmissionRecord &eRec, Point2 &sample1, Point2 &sample luminaire->sampleEmission(eRec, sample1, sample2); eRec.pdfArea *= lumPdf; eRec.luminaire = luminaire; - Float cosTheta = eRec.sRec.n.isZero() ? (Float) 1 : absDot(eRec.sRec.n, eRec.d); + Float cosTheta = (eRec.luminaire->getType() & Luminaire::EOnSurface) ? absDot(eRec.sRec.n, eRec.d) : 1; eRec.P *= cosTheta / (eRec.pdfArea * eRec.pdfDir); } diff --git a/src/librender/vpl.cpp b/src/librender/vpl.cpp index 3808a6e6..6cc4270b 100644 --- a/src/librender/vpl.cpp +++ b/src/librender/vpl.cpp @@ -47,13 +47,13 @@ size_t generateVPLs(const Scene *scene, size_t offset, size_t count, int maxDept weight = eRec.P / eRec.pdfArea; VPL lumVPL(ELuminaireVPL, weight); lumVPL.its.p = eRec.sRec.p; - lumVPL.its.shFrame = eRec.luminaire->getType() == Luminaire::EDeltaPosition - ? stdFrame : Frame(eRec.sRec.n); + lumVPL.its.shFrame = (eRec.luminaire->getType() & Luminaire::EOnSurface) + ? Frame(eRec.sRec.n) : stdFrame; lumVPL.luminaire = eRec.luminaire; vpls.push_back(lumVPL); weight *= scene->sampleEmissionDirection(eRec, dirSample); - Float cosTheta = eRec.sRec.n.isZero() ? (Float) 1 : absDot(eRec.sRec.n, eRec.d); + Float cosTheta = (eRec.luminaire->getType() & Luminaire::EOnSurface) ? absDot(eRec.sRec.n, eRec.d) : 1; weight *= cosTheta / eRec.pdfDir; ray = Ray(eRec.sRec.p, eRec.d);