/** * Finds and returns all the lights in the scene. * * If there are multiple ambient lights, returns the weighted (by alpha) average color and summed brightness. * * If there are no lights in the scene, returns some default lights. */ void VuoSceneObject_findLights(VuoSceneObject so, VuoColor *ambientColor, float *ambientBrightness, VuoList_VuoSceneObject *pointLights, VuoList_VuoSceneObject *spotLights) { VuoList_VuoColor ambientColors = VuoListCreate_VuoColor(); VuoRetain(ambientColors); *ambientBrightness = 0; *pointLights = VuoListCreate_VuoSceneObject(); *spotLights = VuoListCreate_VuoSceneObject(); float localModelviewMatrix[16]; VuoTransform_getMatrix(VuoTransform_makeIdentity(), localModelviewMatrix); VuoSceneObject_findLightsRecursive(so, localModelviewMatrix, ambientColors, ambientBrightness, *pointLights, *spotLights); if (!VuoListGetCount_VuoColor(ambientColors) && !VuoListGetCount_VuoSceneObject(*pointLights) && !VuoListGetCount_VuoSceneObject(*spotLights)) { *ambientColor = VuoColor_makeWithRGBA(1,1,1,1); *ambientBrightness = 0.05; // https://en.wikipedia.org/wiki/Three-point_lighting VuoSceneObject keyLight = VuoSceneObject_makePointLight(VuoColor_makeWithRGBA(1,1,1,1), .70, VuoPoint3d_make(-1,1,1), 5, .5); VuoListAppendValue_VuoSceneObject(*pointLights, keyLight); VuoSceneObject fillLight = VuoSceneObject_makePointLight(VuoColor_makeWithRGBA(1,1,1,1), .2, VuoPoint3d_make(.5,0,1), 5, 0); VuoListAppendValue_VuoSceneObject(*pointLights, fillLight); VuoSceneObject backLight = VuoSceneObject_makePointLight(VuoColor_makeWithRGBA(1,1,1,1), .15, VuoPoint3d_make(1,.75,-.5), 5, 0); VuoListAppendValue_VuoSceneObject(*pointLights, backLight); } else *ambientColor = VuoColor_average(ambientColors); VuoRelease(ambientColors); }
/** * Returns a scene object consisting of 6 child objects (square quads), each with its own shader. */ VuoSceneObject VuoSceneObject_makeCube(VuoTransform transform, VuoShader frontShader, VuoShader leftShader, VuoShader rightShader, VuoShader backShader, VuoShader topShader, VuoShader bottomShader) { VuoList_VuoSceneObject cubeChildObjects = VuoListCreate_VuoSceneObject(); VuoMesh quadMesh = VuoMesh_makeQuad(); // Front Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, frontShader, VuoTransform_makeEuler(VuoPoint3d_make(0,0,.5), VuoPoint3d_make(0,0,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } // Left Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, leftShader, VuoTransform_makeEuler(VuoPoint3d_make(-.5,0,0), VuoPoint3d_make(0,-M_PI/2.,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } // Right Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, rightShader, VuoTransform_makeEuler(VuoPoint3d_make(.5,0,0), VuoPoint3d_make(0,M_PI/2.,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } // Back Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, backShader, VuoTransform_makeEuler(VuoPoint3d_make(0,0,-.5), VuoPoint3d_make(0,M_PI,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } // Top Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, topShader, VuoTransform_makeEuler(VuoPoint3d_make(0,.5,0), VuoPoint3d_make(-M_PI/2.,0,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } // Bottom Face { VuoSceneObject so = VuoSceneObject_make( quadMesh, bottomShader, VuoTransform_makeEuler(VuoPoint3d_make(0,-.5,0), VuoPoint3d_make(M_PI/2.,0,0), VuoPoint3d_make(1,1,1)), NULL ); VuoListAppendValue_VuoSceneObject(cubeChildObjects, so); } return VuoSceneObject_make(NULL, NULL, transform, cubeChildObjects); }
"title" : "Copy 3D Object with Transforms", "keywords" : [ "duplicate", "clone", "array", "instance", "instantiate", "populate", "replicate" ], "version" : "2.0.0", "node": { "exampleCompositions" : [ ] } }); void nodeEvent ( VuoInputData(VuoSceneObject) object, VuoInputData(VuoList_VuoTransform) transforms, VuoOutputData(VuoSceneObject) copies ) { *copies = VuoSceneObject_makeEmpty(); copies->childObjects = VuoListCreate_VuoSceneObject(); for(int i = 0; i < VuoListGetCount_VuoTransform(transforms); i++) { VuoTransform transform = VuoListGetValue_VuoTransform(transforms, i+1); VuoListAppendValue_VuoSceneObject(copies->childObjects, VuoSceneObject_make( object.mesh, object.shader, transform, object.childObjects )); } }