Esempio n. 1
0
status
elementVector(Vector v, Int e, Any obj)
{ int n = indexVector(v, e);

  if ( n < 0 )
  { int nsize = valInt(v->size)-n;
    Any *newElements = alloc(nsize*sizeof(Any));
    int m;

    if ( v->elements )
    { cpdata(&newElements[-n], v->elements, Any, valInt(v->size));
      unalloc(valInt(v->allocated)*sizeof(Any), v->elements);
    }
    v->elements = newElements;
    for( m = 0; m < -n; m++ )
      v->elements[m] = NIL;
    assignVector(v, 0, obj);

    assign(v, size,	 toInt(nsize));
    assign(v, allocated, toInt(nsize));
    assign(v, offset,	 toInt(valInt(e)-1));

    succeed;
  }

  if ( n >= valInt(v->size) )
  { int m;

    if ( n >= valInt(v->allocated) )
    { int nalloc = max(valInt(v->allocated)*2, n+1);
      Any *newElements = alloc(nalloc * sizeof(Any));

      if ( v->elements )
      { cpdata(newElements, v->elements, Any, valInt(v->size));
	unalloc(valInt(v->allocated)*sizeof(Any), v->elements);
      }
      v->elements = newElements;
      assign(v, allocated, toInt(nalloc));
    }
    for( m = valInt(v->size); m <= n ; m++ )
      v->elements[m] = NIL;
    assignVector(v, n, obj);

    assign(v, size, toInt(n+1));

    succeed;
  }

  assignVector(v, n, obj);

  succeed;
}
Esempio n. 2
0
static status
insertVector(Vector v, Int where, Any obj)
{ int size   = valInt(v->size);
  int offset = valInt(v->offset);
  int i;
  Any *s, *p;

  if ( valInt(where) <= offset+1 )
  { assign(v, offset, toInt(offset+1));

    return elementVector(v, where, obj);
  }
  if ( valInt(where) > size+offset )
    return elementVector(v, where, obj);

  elementVector(v, toInt(size+offset+1), NIL);
  i = indexVector(v, where);
  s = &v->elements[i];
  p = &v->elements[valInt(v->size)-1];	/* point to last element */
  for( ; p>s; p-- )
  { p[0] = p[-1];
  }
  v->elements[i] = NIL;
  assignVector(v, i, obj);

  succeed;
}
Esempio n. 3
0
status
fillVector(Vector v, Any obj, Int from, Int to)
{ int f, t;

  f = (isDefault(from) ? valInt(getLowIndexVector(v)) : valInt(from));
  t = (isDefault(to)   ? valInt(getHighIndexVector(v)) : valInt(to));

  if ( t < f )
    fail;

  if ( v->size == ZERO )
  { int size = t-f+1;
    int n;

    assign(v, offset,	 toInt(f - 1));
    assign(v, size,	 toInt(size));
    assign(v, allocated, v->size);
    if ( v->elements )
      unalloc(0, v->elements);
    v->elements = alloc(sizeof(Any) * size);
    for(n=0; n<size; n++)
    { v->elements[n] = NIL;
      if ( notNil(obj) )
	assignVector(v, n, obj);
    }
  } else
  { elementVector(v, toInt(f), obj);
    elementVector(v, toInt(t), obj);
    while( ++f < t )
      elementVector(v, toInt(f), obj);
  }

  succeed;
}
Esempio n. 4
0
status
shiftVector(Vector v, Int places)
{ int n = valInt(v->size);
  int s = valInt(places);
  int i;

  if ( s > 0 )
  { for(i=n-s; i < n; i++)
      assignVector(v, i, NIL);
    for(i = n - 1; i >= s; i--)
      v->elements[i] = v->elements[i-s];
    for( ; i >= 0; i-- )
      v->elements[i] = NIL;
  } else
  { for(i = 0; i < -s; i++)
      assignVector(v, i, NIL);
    for(i = 0; i < n+s; i++)
      v->elements[i] = v->elements[i-s];
    for( ; i < n; i++ )
      v->elements[i] = NIL;
  }

  succeed;
}
Esempio n. 5
0
API void updateOpenGLLodMap(OpenGLLodMap *lodmap, Vector *position, bool autoExpand)
{
	// update the viewer position
	assignVector(lodmap->viewerPosition, position);

	if(autoExpand) {
		// expand the quadtree to actually cover our position
		float *positionData = getVectorData(position);
		expandQuadtree(lodmap->quadtree, positionData[0], positionData[2]);
	}

	double range = getLodMapNodeRange(lodmap, lodmap->quadtree->root);

	// free our previous selection list
	g_list_free(lodmap->selection);
	lodmap->selection = NULL;

	// select the LOD map nodes to be rendered
	if(lodmapQuadtreeNodeIntersectsSphere(lodmap, lodmap->quadtree->root, position, range)) {
		lodmap->selection = selectLodMapNodes(lodmap, position, lodmap->quadtree->root);

		// make all selected nodes visible
		for(GList *iter = lodmap->selection; iter != NULL; iter = iter->next) {
			QuadtreeNode *node = iter->data;
			OpenGLLodMapTile *tile = node->data;

			// wait until the node is fully loaded
			g_mutex_lock(&tile->mutex);
			while(tile->status == OPENGL_LODMAP_TILE_LOADING) {
				g_cond_wait(&tile->condition, &tile->mutex);
			}
			g_mutex_unlock(&tile->mutex);

			// activate if not active yet
			if(tile->status != OPENGL_LODMAP_TILE_ACTIVE) {
				activateLodMapTile(lodmap, node);
			}

			tile->model->visible = true; // make model visible for rendering
			tile->model->polygonMode = lodmap->polygonMode; // set the parent's polygon mode
		}

		QuadtreeAABB box = quadtreeNodeAABB(lodmap->quadtree->root);
		logInfo("Updated LOD map for quadtree covering range [%d,%d]x[%d,%d] on %u levels: %d nodes selected", box.minX, box.maxX, box.minY, box.maxY, lodmap->quadtree->root->level, g_list_length(lodmap->selection));
	}
}
Esempio n. 6
0
static status
loadVector(Vector v, IOSTREAM *fd, ClassDef def)
{ int n;
  Any obj;
  int size;

  loadSlotsObject(v, fd, def);
  size = valInt(v->size);
  v->allocated = v->size;
  v->elements = alloc(size * sizeof(Any));
  for(n = 0; n < size; n++)
  { TRY( obj = loadObject(fd) );
    v->elements[n] = NIL;
    assignVector(v, n, obj);
  }

  succeed;
}
Esempio n. 7
0
status
initialiseVectorv(Vector v, int argc, Any *argv)
{ int n;

  v->offset = ZERO;
  v->size = toInt(argc);
  v->allocated = v->size;
  if ( argc > 0 )
  { v->elements = alloc(argc * sizeof(Any));

    for(n=0; n < argc; n++)
    { v->elements[n] = NIL;
      assignVector(v, n, argv[n]);
    }
  } else
    v->elements = NULL;

  succeed;
}
Esempio n. 8
0
  void State::applyUniformsMappings()
  {
    if (m_materials.isEmpty()) return;
    Material& mat = *m_materials.back();
    /// @todo should maybe work without shaders
    if (!mat.prog()) return;
    GLProgram& prog = *mat.prog();
    CameraPtr c = camera();
    for (auto it = mat.uniformMap().begin(); it != mat.uniformMap().end(); ++it) {
      const MappableValue& map = *it;
      bool ok = true;

      if (map.src() == "model") {
        if (map.var() == "transform")
          setUniform(prog, it.key(), model());
        else if (map.var() == "modelview" && c) {
          glm::mat4 m = (c->view() * model());
          prog.setUniform(this, it.key(), m);
        } else ok = false;
      }

      else if (map.src() == "material") {
        if (map.var() == "diffuse")
          setUniformSel(this, prog, it.key(), mat.colors.diffuse, map.select());
        else if (map.var() == "ambient")
          setUniformSel(this, prog, it.key(), mat.colors.ambient, map.select());
        else if (map.var() == "specular")
          setUniformSel(this, prog, it.key(), mat.colors.specular, map.select());
        else if (map.var() == "transparent")
          setUniformSel(this, prog, it.key(), mat.colors.transparent, map.select());
        else if (map.var() == "emissive")
          setUniformSel(this, prog, it.key(), mat.colors.emissive, map.select());

        else if (map.var() == "wireframe")
          prog.setUniform(this, it.key(), mat.style.wireframe);
        else if (map.var() == "twosided")
          prog.setUniform(this, it.key(), mat.style.twosided);

        else if (map.var() == "opacity")
          prog.setUniform(this, it.key(), mat.style.opacity);
        else if (map.var() == "shininess")
          prog.setUniform(this, it.key(), mat.style.shininess);
        else if (map.var() == "shininess_strength")
          prog.setUniform(this, it.key(), mat.style.shininess_strength);
        else if (map.var() == "refracti")
          prog.setUniform(this, it.key(), mat.style.refracti);
        else ok = false;
      }

      else if (map.src() == "scene") {
        if (map.var() == "size")
          setUniformSel(this, prog, it.key(),
                        glm::vec2(m_scene.width(), m_scene.height()), map.select());
        else if (map.var() == "time")
          prog.setUniform(this, it.key(), m_time);
        else if (map.var() == "dt")
          prog.setUniform(this, it.key(), m_dt);
        else ok = false;
      }

      else if (map.src() == "camera" && c) {
        if (map.var() == "target")
          setUniformSel(this, prog, it.key(), c->target(), map.select());
        else if (map.var() == "up")
          setUniformSel(this, prog, it.key(), c->up(), map.select());
        else if (map.var() == "right")
          setUniformSel(this, prog, it.key(), c->right(), map.select());
        else if (map.var() == "front")
          setUniformSel(this, prog, it.key(), c->front(), map.select());

        else if (map.var() == "view")
          setUniform(prog, it.key(), c->view());
        else if (map.var() == "projection")
          prog.setUniform(this, it.key(), c->projection());

        else if (map.var() == "dist")
          prog.setUniform(this, it.key(), c->dist());
        else if (map.var() == "fov")
          prog.setUniform(this, it.key(), c->fov());
        else if (map.var() == "near")
          prog.setUniform(this, it.key(), c->near());
        else if (map.var() == "far")
          prog.setUniform(this, it.key(), c->far());
        else if (map.var() == "size")
          setUniformSel(this, prog, it.key(),
                        glm::vec2(c->width(), c->height()), map.select());
        else ok = false;
      }

      else if (map.src() == "lights" || map.src() == "light") {
        if (map.var() == "ambient")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::ambient);
        else if (map.var() == "diffuse")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::diffuse);
        else if (map.var() == "specular")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::specular);
        else if (map.var() == "direction")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::direction);
        else if (map.var() == "location")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::location);
        else if (map.var() == "target")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::target);
        else if (map.var() == "spot_cutoff")
          assignVector(this, prog, it.key(), map, m_data.back().m_lights, &Light::spotCutoff);
        else ok = false;
      }

      else if (map.src() == "gui") {
        if (map.var() == "mouse")
          setUniformSel(this, prog, it.key(), m_scene.lastRenderOpts().hover, map.select());
        else if (map.var() == "mousedown")
          setUniformSel(this, prog, it.key(), m_scene.lastRenderOpts().mousedown, map.select());
        else ok = false;
      }

      else ok = false;
    }
  }