Light* Light::clone(NodeCloneContext &context) { Light* lightClone = NULL; switch (_type) { case DIRECTIONAL: lightClone = createDirectional(getColor()); break; case POINT: lightClone = createPoint(getColor(), getRange()); break; case SPOT: lightClone = createSpot(getColor(), getRange(), getInnerAngle(), getOuterAngle()); break; default: GP_ERROR("Unsupported light type (%d).", _type); return NULL; } GP_ASSERT(lightClone); if (Node* node = context.findClonedNode(getNode())) { lightClone->setNode(node); } return lightClone; }
/* *createZone function * *p : a pointer to an array of strings represinting a zone * *this function will take an array of strings represinting a zone *and return a struct zone */ struct zone *createZone(char **p) { struct zone *z; char *temp; char **params; int now; int n = 0; int i; int end_of_perimeter; int s_start; int s_end; z = malloc(sizeof(struct zone)); assert(z != 0); now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); z -> zone_id = atoi(params[1]); freeCharArray(params, now); n++; now = numberOfWords(p[n]); assert(now == 2); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); z -> number_of_parking_spots = atoi(params[1]); freeCharArray(params, now); n++; temp = "zone_name"; now = numberOfWords(p[n]); params = divideLine(p[n], now, MAX_STRING_LENGTH); assert(params != 0); if(compTwoStrings(params[0], temp)){ assert(now == 2); z -> zone_name = malloc(MAX_STRING_LENGTH * sizeof(char)); stringCopy(params[1], z -> zone_name); n++; } else z -> zone_name = 0; freeCharArray(params, now); z -> zone_perimeter = createPerimeter(p + n); end_of_perimeter = n; temp = "end_perimeter"; now = numberOfWords(p[end_of_perimeter]); params = divideLine(p[end_of_perimeter], now, MAX_STRING_LENGTH); assert(params != 0); while(!compTwoStrings(temp, params[0])){ freeCharArray(params, now); end_of_perimeter++; now = numberOfWords(p[end_of_perimeter]); params = divideLine(p[end_of_perimeter], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); n = ++end_of_perimeter; z -> parking_spots_list = malloc(z -> number_of_parking_spots * sizeof(struct zone)); s_start = n; s_end = n + 1; temp = "end_spot"; for(i = 0; i < z -> number_of_parking_spots; i++){ z -> parking_spots_list[i] = createSpot((p + s_start)); now = numberOfWords(p[s_end]); params = divideLine(p[s_end], now, MAX_STRING_LENGTH); assert(params != 0); while(!compTwoStrings(temp, params[0])){ freeCharArray(params, now); s_end++; now = numberOfWords(p[s_end]); params = divideLine(p[s_end], now, MAX_STRING_LENGTH); assert(params != 0); } freeCharArray(params, now); s_end++; s_start = s_end; } return z; }
Light* Light::create(Properties* properties) { GP_ASSERT(properties); // Read light type std::string typeStr; if (properties->exists("type")) typeStr = properties->getString("type"); Light::Type type; if (typeStr == "DIRECTIONAL") { type = Light::DIRECTIONAL; } else if (typeStr == "POINT") { type = Light::POINT; } else if (typeStr == "SPOT") { type = Light::SPOT; } else { GP_ERROR("Invalid 'type' parameter for light definition."); return NULL; } // Read common parameters kmVec3 color = vec3Zero; if (!properties->getVector3("color", &color)) { GP_ERROR("Missing valid 'color' parameter for light definition."); return NULL; } // Read light-specific parameters Light* light = NULL; switch (type) { case DIRECTIONAL: light = createDirectional(color); break; case POINT: { float range = properties->getFloat("range"); if (range == 0.0f) { GP_ERROR("Missing valid 'range' parameter for point light definition."); return NULL; } light = createPoint(color, range); } break; case SPOT: float range = properties->getFloat("range"); if (range == 0.0f) { GP_ERROR("Missing valid 'range' parameter for spot light definition."); return NULL; } float innerAngle = properties->getFloat("innerAngle"); if (innerAngle == 0.0f) { GP_ERROR("Missing valid 'innerAngle' parameter for spot light definition."); return NULL; } float outerAngle = properties->getFloat("outerAngle"); if (outerAngle == 0.0f) { GP_ERROR("Missing valid 'outerAngle' parameter for spot light definition."); return NULL; } light = createSpot(color, range, innerAngle, outerAngle); break; } return light; }