void sceneGeneratePhotons(Scene *scene, const int lightRayBounces, const int numPhotonsPerLightSource) { photonEndPointContainerClear(&scene->photons); containerForeach (SceneObject *, object, scene->objects) { // TODO: Distribute photons based on light intensity. // Only emit photons from object with radiance. if (!cEqual(sceneObjectRadiantFlux(*object), makeColorBlack())) { // Spawn photons on the surface of the lightsource. PhotonContainer emittedPhotons = makePhotonContainer(numPhotonsPerLightSource); sceneObjectEmitPhotons(*object, numPhotonsPerLightSource, &emittedPhotons); containerForeach (Photon, photon, emittedPhotons) { // Save it for rendering. photonEndPointContainerAddValue(&scene->photons, makePhotonEndPoint(*photon, makeIntersection(origin, makeVectorOrigo(), 0, makeVectorOrigo(), NULL))); for(int bounce=0; bounce<lightRayBounces; ++bounce){ // Check if the photon hits anyting. Intersection intersection = sceneIntersectRay(*scene, photon->heading); if(intersection.hitType != surface) break; // Bounce the photon, filtering it by the reflectance. *photon = materialSampleBRDF(intersection.material, intersection, *photon); // Save it for rendering. photonEndPointContainerAddValue(&scene->photons, makePhotonEndPoint(*photon, intersection)); } } // Done with them. photonContainerDestroy(&emittedPhotons); }
static EjsVar *invokeArrayOperator(Ejs *ejs, EjsVar *lhs, int opcode, EjsVar *rhs) { EjsVar *result; if (rhs == 0 || lhs->type != rhs->type) { if ((result = coerceArrayOperands(ejs, lhs, opcode, rhs)) != 0) { return result; } } switch (opcode) { case EJS_OP_COMPARE_EQ: case EJS_OP_COMPARE_STRICTLY_EQ: case EJS_OP_COMPARE_LE: case EJS_OP_COMPARE_GE: return (EjsVar*) ejsCreateBoolean(ejs, (lhs == rhs)); case EJS_OP_COMPARE_NE: case EJS_OP_COMPARE_STRICTLY_NE: case EJS_OP_COMPARE_LT: case EJS_OP_COMPARE_GT: return (EjsVar*) ejsCreateBoolean(ejs, !(lhs == rhs)); /* * Unary operators */ case EJS_OP_COMPARE_NOT_ZERO: return (EjsVar*) ejs->trueValue; case EJS_OP_COMPARE_UNDEFINED: case EJS_OP_COMPARE_NULL: case EJS_OP_COMPARE_FALSE: case EJS_OP_COMPARE_TRUE: case EJS_OP_COMPARE_ZERO: return (EjsVar*) ejs->falseValue; case EJS_OP_LOGICAL_NOT: case EJS_OP_NOT: case EJS_OP_NEG: return (EjsVar*) ejs->oneValue; /* * Binary operators */ case EJS_OP_DIV: case EJS_OP_MUL: case EJS_OP_REM: case EJS_OP_SHR: case EJS_OP_USHR: case EJS_OP_XOR: return (EjsVar*) ejs->zeroValue; #if BLD_FEATURE_EJS_LANG >= EJS_SPEC_PLUS /* * Operator overload */ case EJS_OP_ADD: result = (EjsVar*) ejsCreateArray(ejs, 0); pushArray(ejs, (EjsArray*) result, 1, (EjsVar**) &lhs); pushArray(ejs, (EjsArray*) result, 1, (EjsVar**) &rhs); return result; case EJS_OP_AND: return (EjsVar*) makeIntersection(ejs, (EjsArray*) lhs, (EjsArray*) rhs); case EJS_OP_OR: return (EjsVar*) makeUnion(ejs, (EjsArray*) lhs, (EjsArray*) rhs); case EJS_OP_SHL: return pushArray(ejs, (EjsArray*) lhs, 1, &rhs); case EJS_OP_SUB: return (EjsVar*) removeArrayElements(ejs, (EjsArray*) lhs, (EjsArray*) rhs); #endif default: ejsThrowTypeError(ejs, "Opcode %d not implemented for type %s", opcode, lhs->type->qname.name); return 0; } mprAssert(0); }
static EjsAny *invokeArrayOperator(Ejs *ejs, EjsAny *lhs, int opcode, EjsAny *rhs) { EjsAny *result; if (rhs == 0 || TYPE(lhs) != TYPE(rhs)) { if ((result = coerceArrayOperands(ejs, lhs, opcode, rhs)) != 0) { return result; } } switch (opcode) { case EJS_OP_COMPARE_EQ: case EJS_OP_COMPARE_STRICTLY_EQ: case EJS_OP_COMPARE_LE: case EJS_OP_COMPARE_GE: return ejsCreateBoolean(ejs, (lhs == rhs)); case EJS_OP_COMPARE_NE: case EJS_OP_COMPARE_STRICTLY_NE: case EJS_OP_COMPARE_LT: case EJS_OP_COMPARE_GT: return ejsCreateBoolean(ejs, !(lhs == rhs)); /* Unary operators */ case EJS_OP_COMPARE_NOT_ZERO: return ESV(true); case EJS_OP_COMPARE_UNDEFINED: case EJS_OP_COMPARE_NULL: case EJS_OP_COMPARE_FALSE: case EJS_OP_COMPARE_TRUE: case EJS_OP_COMPARE_ZERO: return ESV(false); case EJS_OP_LOGICAL_NOT: case EJS_OP_NOT: case EJS_OP_NEG: return ESV(one); /* Binary operators */ case EJS_OP_DIV: case EJS_OP_MUL: case EJS_OP_REM: case EJS_OP_SHR: case EJS_OP_USHR: case EJS_OP_XOR: return ESV(zero); /* Operator overload */ case EJS_OP_ADD: result = ejsCreateArray(ejs, 0); pushArray(ejs, result, 1, &lhs); pushArray(ejs, result, 1, &rhs); return result; case EJS_OP_AND: return makeIntersection(ejs, lhs, rhs); case EJS_OP_OR: return makeUnion(ejs, lhs, rhs); case EJS_OP_SHL: return pushArray(ejs, lhs, 1, &rhs); case EJS_OP_SUB: return ejsRemoveItems(ejs, lhs, rhs); default: ejsThrowTypeError(ejs, "Opcode %d not implemented for type %@", opcode, TYPE(lhs)->qname.name); return 0; } assert(0); }