Exemplo n.º 1
0
REAL putItem(sparseVector *sparse, int targetIndex, REAL value)
{
  REAL last = 0.0;
  int  posIndex;

  if(targetIndex < 0) {
    posIndex = -targetIndex;
    if(posIndex > sparse->count)
      return(last);
    targetIndex = sparse->index[posIndex];
  }
  else
    posIndex = findIndex(targetIndex, sparse->index, sparse->count, BLAS_BASE);

  if(fabs(value) < MACHINEPREC)
    value = 0;

  if(targetIndex == sparse->index[0]) 
    sparse->value[0] = value;

  if(posIndex < 0) {
    if(value != 0) {
      if(sparse->count == sparse->size)
        resizeVector(sparse, sparse->size + RESIZEDELTA);
      posIndex = -posIndex;
      sparse->count++;
      if(posIndex < sparse->count) 
        moveVector(sparse, posIndex+1, posIndex, sparse->count-posIndex);
      sparse->value[posIndex] = value;
      sparse->index[posIndex] = targetIndex;
    }
  }
  else {
    if(value == 0) {
      last = sparse->value[posIndex];
      if(sparse->count > posIndex) 
        moveVector(sparse, posIndex, posIndex+1, sparse->count-posIndex);
      sparse->count--;
    }
    else {
      sparse->value[posIndex] = value;
      sparse->index[posIndex] = targetIndex;
    }
  }

#ifdef DEBUG_SPARSELIB
  verifyVector(sparse);
#endif

  return(last);
}
Exemplo n.º 2
0
void MoveTool::mouseReleaseEvent(const QList<QGraphicsItem*> &itemList,
                                 QGraphicsSceneMouseEvent *event)
{
    if (m_moveManipulator.isActive()) {
        if (m_movingItems.isEmpty())
            return;

        QLineF moveVector(event->scenePos(), m_moveManipulator.beginPoint());
        if (moveVector.length() < QApplication::startDragDistance())
        {
            QPointF beginPoint(m_moveManipulator.beginPoint());

            m_moveManipulator.end(beginPoint);

            //        m_selectionIndicator.show();
            m_resizeIndicator.show();
            m_movingItems.clear();

            view()->changeToSelectionTool(event);
        } else {
            m_moveManipulator.end(event->scenePos());

            m_selectionIndicator.show();
            m_resizeIndicator.show();
            m_movingItems.clear();
        }
    }

    AbstractFormEditorTool::mouseReleaseEvent(itemList, event);
}
Exemplo n.º 3
0
void
GLWidget::moveView(const QPoint &screenDelta)
{
    slotUnlockView();
    MapPoint mapDelta = screenPointToRelativeMapPoint(screenDelta);
    Vec2f moveVector(-mapDelta.x, mapDelta.y);
    _mapView.move(moveVector);
    _updateViewCtx();
    updateGL();
}
 void ExplosionEffectsManager::ExplosionEffect::run(TweensManager* tweensManager, const FinishCallback& finishCallback)
 {
     Random& random = Random::getInstance();
     
     float maxDuration = -1.0f;
     SequenceTween* longestSequence = nullptr;
     
     for (int i=0; i<N_BITS; ++i)
     {
         float angle = (i * (360.0f / N_BITS));
         auto sprite = sprites[i];
         sprite->setScale(1.0f);
         sprite->setRotation(angle);
         
         float dist = (40.0f + random.next() * 30.0f);
         Vec2 moveVector(std::cos(angle)*dist, std::sin(angle)*dist);
         Vec2 endPosition = (sprite->getPosition() + moveVector);
         
         float speed = (125.0f + random.next() * 25.0f);
         float movementDuration = (dist / speed);
         float endDelay = 0.0f;
         
         auto sequenceTween = new SequenceTween();
         auto moveAndFade = new ConcurrentTween();
         moveAndFade->addTween(new EaseTween(new MoveTween(sprite, endPosition, movementDuration), EaseFunctions::easeIn));
         moveAndFade->addTween(new RotateTween(sprite, 2.0f*speed, movementDuration));
         moveAndFade->addTween(new EaseTween(new ScaleTween(sprite, 0.25f, movementDuration), EaseFunctions::easeOut));
         sequenceTween->addTween(moveAndFade);
         sequenceTween->addTween(new DelayTween(endDelay));
         sequenceTween->addTween(new VisibilityTween(sprite, false));
         tweensManager->addTween(sequenceTween);
         
         float tweenDuration = (movementDuration + endDelay);
         if (tweenDuration > maxDuration)
         {
             maxDuration = tweenDuration;
             longestSequence = sequenceTween;
         }
     }
     
     longestSequence->addTween(new FunctionTween(finishCallback));
 }
Exemplo n.º 5
0
	void MainLoop()
	{
		if (this->cameraTransform != 0)
		{
			// Free flight navigation - as it would be in a non reference point environments like space
			MwMatrix m;
			MwMatrix::CreateRotationY(m, -this->mouseDeltaX / 100.0f);
			MwMatrix::Multiply(this->cameraTransform->manual, m, this->cameraTransform->manual);
			MwMatrix::CreateRotationX(m, this->mouseDeltaY / 100.0f);
			MwMatrix::Multiply(this->cameraTransform->manual, m, this->cameraTransform->manual);

			MwVector3 moveVector(
				this->keys['D'] ? -1.0f : this->keys['A'] ? 1.0f : 0.0f,
				this->keys[VK_SPACE] ? 1.0f : this->keys[VK_SHIFT] ? -1.0f : 0.0f,
				this->keys['W'] ? 1.0f : this->keys['S'] ? -1.0f : 0.0f);
			MwVector3::Scale(moveVector, moveVector, this->engine->timer->time * 10.0f);
			MwMatrix::CreateTranslation(m, moveVector);
			MwMatrix::Multiply(this->cameraTransform->manual, m, this->cameraTransform->manual);
		}

		this->engine->RenderWorld();
	};
Exemplo n.º 6
0
void clearVector(sparseVector *sparse, int indexStart, int indexEnd)
{
  int i;

  i = sparse->count;
  if(i==0) return;

  if(indexStart<=0)
    indexStart=sparse->index[1];
  if(indexEnd<=0)
    indexEnd=sparse->index[i];

  if(indexStart>indexEnd) return;

  if(sparse->index[0]>=indexStart && sparse->index[0]<=indexEnd) {
    sparse->value[0] = 0;
  }
  if(indexStart<=sparse->index[1] && indexEnd>=sparse->index[i]) 
    sparse->count = 0;
  else {
    while(i>0 && sparse->index[i]>indexEnd) i--;
    indexEnd = i;
    while(i>0 && sparse->index[i]>=indexStart) i--;
    indexStart = i+1;
    if(indexEnd>=indexStart) {
      i = sparse->count-indexEnd;
      moveVector(sparse, indexStart, indexEnd+1, i);
      sparse->count -= indexEnd-indexStart+1;
    }
  }

#ifdef DEBUG_SPARSELIB
  verifyVector(sparse);
#endif

}
Exemplo n.º 7
0
int main(int argc, char** argv) {
    unsigned int WINDOW_WIDTH = 800;
    unsigned int WINDOW_HEIGHT = 600;
    std::string LEVEL_TILE_SHEET_FILENAME = "assets/tileset.png";
    std::string LEVEL_FILE = "assets/mapEditorLevel.level";
    const std::string LEVEL_FIlE_EXPORT = "assets/mapEditorLevelExport.level";
    const char* tileArgs[] = {"assets/TileData/redGrass.tile", "assets/TileData/redGrassWebTL.tile", "assets/TileData/redGrassWebT.tile",
                              "assets/TileData/redGrassWebTR.tile", "assets/TileData/redGrassWebML.tile", "assets/TileData/redGrassWebM.tile",
                              "assets/TileData/redGrassWebMR.tile", "assets/TileData/redGrassWebBL.tile", "assets/TileData/redGrassWebB.tile",
                              "assets/TileData/redGrassWebBR.tile", "assets/TileData/spikyBush.tile", "assets/TileData/spikyTree.tile",
                              "assets/TileData/spikyBush.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/spikyBush.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/spikyBush.tile", "assets/TileData/spikyBush.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", 
                              "assets/TileData/water.tile", "assets/TileData/water.tile", "assets/TileData/waterBL.tile", 
                              "assets/TileData/waterB.tile", "assets/TileData/waterBR.tile", "assets/TileData/waterL.tile",
                              "assets/TileData/waterR.tile",
                              "assets/TileData/waterTL.tile", "assets/TileData/waterT.tile", "assets/TileData/waterTR.tile",
                              "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile",
                              "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile", "assets/TileData/noCollisionTile.tile"};
    const std::vector<std::string> TILE_FILEPATHS(tileArgs, tileArgs + 46);
    
    sf::Vector2f position;
    
    sf::View view;
    sf::RenderWindow window(sf::VideoMode(WINDOW_WIDTH, WINDOW_HEIGHT, 32), "MapViewer", sf::Style::Titlebar | sf::Style::Close);
    view.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
    window.setFramerateLimit(60);
    
    SpriteView levelView;
    Level level;

    int curTile = 1;
    sf::Vector2i tilePos;
    sf::Vector2i mousePos;
    
    if (!level.init(LEVEL_FILE)) {
        fprintf(stderr, "Error: Unable to load level. Program exiting\n");
        std::exit(-1);
    }
    
    if (!levelView.init(LEVEL_TILE_SHEET_FILENAME, level.tileLength, level.tileLength)) {
        fprintf(stderr, "Error: Unable to load level tile sheet. Program exiting\n");
        std::exit(-1);
    }    
    
    // start main loop
    while(window.isOpen()) {
        // process events
        sf::Event event;
        
        while(window.pollEvent(event)) {
            // Exit
            if(event.type == sf::Event::Closed) {
                window.close();
            }
            if(event.type == sf::Event::KeyReleased){
                if(event.key.code == sf::Keyboard::M){
                    curTile = curTile + 1;
                }
                if(event.key.code == sf::Keyboard::N){
                    curTile = curTile - 1;
                }
            }
        }
        
        // get movement vector from keyboard
        sf::Vector2f moveVector(0.0f, 0.0f);
        float factor = 1.0f;
        float baseSpeed = 5.0f;
        
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down)) {
            moveVector.y += 1.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up)) {
            moveVector.y -= 1.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Right)) {
            moveVector.x += 1.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Left)) {
            moveVector.x -= 1.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::Tab)) {
            factor = 2.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::LShift)) {
            factor = 4.0f;
        }
        if (sf::Keyboard::isKeyPressed(sf::Keyboard::LControl)) {
            factor = 8.0f;
        }
        
        //update position based on factor and movement vector
        position += moveVector * (factor * baseSpeed);

        //allow for selecting which tile is being placed
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num0)) {
            curTile = 0;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num1)) {
            curTile = 1;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num2)) {
            curTile = 2;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num3)) {
            curTile = 3;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num4)) {
            curTile = 4;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num5)) {
            curTile = 5;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num6)) {
            curTile = 6;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num7)) {
            curTile = 7;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num8)) {
            curTile = 8;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Num9)) {
            curTile = 9;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Q)) {
            curTile = 10;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::W)) {
            curTile = 11;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::E)) {
            curTile = 12;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::R)) {
            curTile = 13;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::T)) {
            curTile = 14;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Y)) {
            curTile = 15;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::U)) {
            curTile = 16;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::I)) {
            curTile = 17;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::O)) {
            curTile = 18;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::P)) {
            curTile = 19;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::A)) {
            curTile = 20;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::S)) {
            curTile = 21;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::D)) {
            curTile = 22;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::F)) {
            curTile = 23;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::G)) {
            curTile = 24;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::H)) {
            curTile = 25;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::J)) {
            curTile = 26;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::K)) {
            curTile = 27;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::L)) {
            curTile = 28;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Z)) {
            curTile = 29;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::X)) {
            curTile = 30;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::C)) {
            curTile = 31;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::V)) {
            curTile = 32;
        }
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::B)) {
            curTile = 33;
        }





        //handle tile placement
        if(sf::Mouse::isButtonPressed(sf::Mouse::Left)){
            mousePos = sf::Mouse::getPosition(window);
            tilePos = getTilePosition(position, mousePos);
            if (tilePos.x < 0 || tilePos.x >= level.width || tilePos.y < 0 || tilePos.y >= level.height) {

            } else {
                switch(curTile) {
                    case 0:
                        level.tiles[tilePos.x][tilePos.y].resource = 0;
                        break;
                    case 1:
                        level.tiles[tilePos.x][tilePos.y].resource = 1;
                        break;
                    case 2:
                        level.tiles[tilePos.x][tilePos.y].resource = 2;
                        break;
                    case 3:
                        level.tiles[tilePos.x][tilePos.y].resource = 3;
                        break;
                    case 4:
                        level.tiles[tilePos.x][tilePos.y].resource = 4;
                        break;
                    case 5:
                        level.tiles[tilePos.x][tilePos.y].resource = 5;
                        break;
                    case 6:
                        level.tiles[tilePos.x][tilePos.y].resource = 6;
                        break;
                    case 7:
                        level.tiles[tilePos.x][tilePos.y].resource = 7;
                        break;
                    case 8:
                        level.tiles[tilePos.x][tilePos.y].resource = 8;
                        break;
                    case 9:
                        level.tiles[tilePos.x][tilePos.y].resource = 9;
                        break;
                    case 10:
                        level.tiles[tilePos.x][tilePos.y].resource = 10;
                        break;
                    case 11:
                        level.tiles[tilePos.x][tilePos.y].resource = 11;
                        break;
                    case 12:
                        level.tiles[tilePos.x][tilePos.y].resource = 12;
                        break;
                    case 13:
                        level.tiles[tilePos.x][tilePos.y].resource = 13;
                        break;
                    case 14:
                        level.tiles[tilePos.x][tilePos.y].resource = 14;
                        break;
                    case 15:
                        level.tiles[tilePos.x][tilePos.y].resource = 15;
                        break;
                    case 16:
                        level.tiles[tilePos.x][tilePos.y].resource = 16;
                        break;
                    case 17:
                        level.tiles[tilePos.x][tilePos.y].resource = 17;
                        break;
                    case 18:
                        level.tiles[tilePos.x][tilePos.y].resource = 18;
                        break;
                    case 19:
                        level.tiles[tilePos.x][tilePos.y].resource = 19;
                        break;
                    case 20:
                        level.tiles[tilePos.x][tilePos.y].resource = 20;
                        break;
                    case 21:
                        level.tiles[tilePos.x][tilePos.y].resource = 21;
                        break;
                    case 22:
                        level.tiles[tilePos.x][tilePos.y].resource = 22;
                        break;
                    case 23:
                        level.tiles[tilePos.x][tilePos.y].resource = 23;
                        break;
                    case 24:
                        level.tiles[tilePos.x][tilePos.y].resource = 24;
                        break;
                    case 25:
                        level.tiles[tilePos.x][tilePos.y].resource = 25;
                        break;
                    case 26:
                        level.tiles[tilePos.x][tilePos.y].resource = 26;
                        break;
                    case 27:
                        level.tiles[tilePos.x][tilePos.y].resource = 27;
                        break;
                    case 28:
                        level.tiles[tilePos.x][tilePos.y].resource = 28;
                        break;
                    case 29:
                        level.tiles[tilePos.x][tilePos.y].resource = 29;
                        break;
                    case 30:
                        level.tiles[tilePos.x][tilePos.y].resource = 30;
                        break;
                    case 31:
                        level.tiles[tilePos.x][tilePos.y].resource = 31;
                        break;
                    case 32:
                        level.tiles[tilePos.x][tilePos.y].resource = 32;
                        break;
                    case 33:
                        level.tiles[tilePos.x][tilePos.y].resource = 33;
                        break;
                    case 34:
                        level.tiles[tilePos.x][tilePos.y].resource = 34;
                        break;
                    case 35:
                        level.tiles[tilePos.x][tilePos.y].resource = 35;
                        break;
                    case 36:
                        level.tiles[tilePos.x][tilePos.y].resource = 36;
                        break;
                    case 37:
                        level.tiles[tilePos.x][tilePos.y].resource = 37;
                        break;
                    case 38:
                        level.tiles[tilePos.x][tilePos.y].resource = 38;
                        break;
                    case 39:
                        level.tiles[tilePos.x][tilePos.y].resource = 39;
                        break;
                    case 40:
                        level.tiles[tilePos.x][tilePos.y].resource = 40;
                        break;
                    case 41:
                        level.tiles[tilePos.x][tilePos.y].resource = 41;
                        break;
                    case 42:
                        level.tiles[tilePos.x][tilePos.y].resource = 42;
                        break;
                    case 43:
                        level.tiles[tilePos.x][tilePos.y].resource = 43;
                        break;
                    case 44:
                        level.tiles[tilePos.x][tilePos.y].resource = 44;
                        break;
                    case 45:
                        level.tiles[tilePos.x][tilePos.y].resource = 45;
                        break;
                    case 46:
                        level.tiles[tilePos.x][tilePos.y].resource = 46;
                        break;
                    case 47:
                        level.tiles[tilePos.x][tilePos.y].resource = 47;
                        break;

                }
            }
        }
        //handle tile rotation
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Key::LAlt)){
            mousePos = sf::Mouse::getPosition(window);
            tilePos = getTilePosition(position, mousePos);
            level.tiles[tilePos.x][tilePos.y].rotation += 1;
            if (level.tiles[tilePos.x][tilePos.y].rotation == 4) {
                level.tiles[tilePos.x][tilePos.y].rotation = 0;
            }
        }


        //spacebar exports to file
        if(sf::Keyboard::isKeyPressed(sf::Keyboard::Space)){
            level.exportToFile(LEVEL_FIlE_EXPORT, &TILE_FILEPATHS);
            window.clear(sf::Color::White);
        }
        
        // draw the level
        window.clear(sf::Color::Black);
        view.setCenter(position);
        window.setView(view);
        
        // TODO: get a better number than 5 for what to draw around the player based on tile size and game window
        int xLow = std::max(0, int(position.x / level.tileLength) - 5) ;
        int xHigh = std::min(level.width - 1, int(position.x / level.tileLength) + 5);
        int yLow = std::max(0, int(position.y / level.tileLength) - 5);
        int yHigh = std::min(level.height - 1, int(position.y / level.tileLength) + 5);
        
        for (int x = xLow; x <= xHigh; x++) {
            for (int y = yLow; y <= yHigh; y++) {
                levelView.updateSprite(level.tileVector[level.tiles[x][y].resource].tileMapPosition);
                levelView.position = sf::Vector2f(x * level.tileLength, y * level.tileLength);
                levelView.draw(&window);
            }
        }
        
        window.display();
    }
    
    return 0;
}
Exemplo n.º 8
0
void swapItems(sparseVector *sparse, int firstIndex, int secondIndex)
{
  int i,j,ki,kj;
  REAL hold;

  if(firstIndex == secondIndex)
    return;
  if(firstIndex > secondIndex) {
    i = firstIndex;
    firstIndex = secondIndex;
    secondIndex = i;
  }

/* XXX WTF
  if(FALSE) {
    i = 1;
    ki = 0;
    while(i <= sparse->count && (ki = sparse->index[i])<firstIndex) i++;
    j = i;
    kj = 0;
    while(j <= sparse->count && (kj = sparse->index[j])<secondIndex) j++;
  }
  else*/ {
    i = findIndex(firstIndex, sparse->index, sparse->count, BLAS_BASE);
    if(i < 0)
      i = -i;
    j = findIndex(secondIndex, sparse->index, sparse->count, BLAS_BASE);
    if(j < 0)
      j = -j;
  }

  if(i > sparse->count)
    ki = 0;
  else
    ki = sparse->index[i];
  if(j > sparse->count)
    kj = 0;
  else
    kj = sparse->index[j];

  if(ki == firstIndex && kj == secondIndex) {   /* Found both -> swap in place */
    hold = sparse->value[i];
    sparse->value[i] = sparse->value[j];
    sparse->value[j] = hold;

    if(sparse->index[0] == firstIndex)
      sparse->value[0] = sparse->value[i];
    else if(sparse->index[0] == secondIndex)
      sparse->value[0] = sparse->value[j];
  }
  else if(ki == firstIndex) {                   /* Found first, but not the second -> shift left */
    j--;
    if(i < j) {
      hold = sparse->value[i];
      moveVector(sparse, i, i+1, j-i);
      sparse->value[j] = hold;
    }
    sparse->index[j] = secondIndex;

    if(sparse->index[0] == firstIndex)
      sparse->value[0] = 0;
    else if(sparse->index[0] == secondIndex)
      sparse->value[0] = sparse->value[j];

  }
  else if(kj == secondIndex) {                  /* Found second, but not the first -> shift right */
    if(i < j) {
      hold = sparse->value[j];
      moveVector(sparse, i+1, i, j-i);
      sparse->value[i] = hold;
    }
    sparse->index[i] = firstIndex;

    if(sparse->index[0] == firstIndex)
      sparse->value[0] = sparse->value[i];
    else if(sparse->index[0] == secondIndex)
      sparse->value[0] = 0;
  }

#ifdef DEBUG_SPARSELIB
  verifyVector(sparse);
#endif

}
Exemplo n.º 9
0
void motionCallback(int x, int y)
{
  if (selectedView == FRONT)
  {
    controlPoints[selectedPoint[0]][selectedPoint[1]][0] = ToLocalX(x);
    controlPoints[selectedPoint[0]][selectedPoint[1]][1] = ToLocalY(y - height/2);
  }
  else if (selectedView == UP)
  {
    controlPoints[selectedPoint[0]][selectedPoint[1]][0] = ToLocalX(x);
    controlPoints[selectedPoint[0]][selectedPoint[1]][2] = -ToLocalY(y);
  }
  else if (selectedView == LEFT)
  {
    controlPoints[selectedPoint[0]][selectedPoint[1]][2] = -ToLocalX(x - width/2);
    controlPoints[selectedPoint[0]][selectedPoint[1]][1] = ToLocalY(y - height/2);
  }
  else if (selectedView == ROTATE)
  {
    Vector3d lastP = getMousePoint(lastX, lastY, width / 2.0f, height / 2.0f, radius);
    Vector3d currentP = getMousePoint(x - width / 2.0f, y, width / 2.0f, height / 2.0f, radius);

    if (mouseButton == GLUT_LEFT_BUTTON)
    {
      Vector3d rotateVector;
      rotateVector.cross(currentP, lastP);
      double angle = -currentP.angle(lastP) * 2;
      rotateVector = unProjectToEye(rotateVector, eye, center, upVector);

      Vector3d dEye;
      dEye.sub(center, eye);
      dEye = rotate(dEye, rotateVector, -angle);
      upVector = rotate(upVector, rotateVector, -angle);
      eye.sub(center, dEye);
    }
    else if (mouseButton == GLUT_RIGHT_BUTTON) {
      Vector3d dEye;
      dEye.sub(center, eye);
      double offset = 0.025;
      if ((y - lastY) < 0) {
        dEye.scale(1 - offset);
      }
      else {
        dEye.scale(1 + offset);
      }
      eye.sub(center, dEye);
    }
    else if (mouseButton == GLUT_MIDDLE_BUTTON) {
      double dx = x - width / 2.0f - lastX;
      double dy = y - lastY;
      if (dx != 0 || dy != 0)
      {
        Vector3d moveVector(dx, dy, 0);
        moveVector = unProjectToEye(moveVector, eye, center, upVector);
        moveVector.normalize();
        double eyeDistance = Vector3d(eye).distance(Vector3d(center));
        moveVector.scale(std::sqrt(dx*dx + dy*dy) / 1000 * eyeDistance);
        center.add(moveVector);
        eye.add(moveVector);
      }
    }
    lastX = x - width / 2;
    lastY = y;
  }

  EvaluateSurface();
  glutPostRedisplay();
}