Ejemplo n.º 1
0
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;
}
Ejemplo n.º 2
0
/*
 *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;
}
Ejemplo n.º 3
0
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;
}