Exemple #1
0
void Boid::update(void) {

	cohesion(owner->getBoids());
	seperation(owner->getBoids());
	alignment(owner->getBoids());

	// Store the current position so we can use verlet integration lateron:
	lastPosition.x = position.x;
	lastPosition.y = position.y;
	
	// Basic motion:
	position.add(velocity);
	
	// Flip the velocity if the screenbounds are reached (yet to impletement resolveLocation)
	if(position.x >= SCREEN_WIDTH  || position.x <= 0) velocity.x *= -1; 
	if(position.y >= SCREEN_HEIGHT || position.y <= 0) velocity.y *= -1; 
}
void Player::resolveChunkIntersection(const Manifold& manifold, const AABBCollider& blockCollider) {
	//transform.translate(manifold.seperationVector);
	
	//std::cout << "(" << manifold.seperationVector.x << ", " << manifold.seperationVector.y << ", " << manifold.seperationVector.z << ")" << std::endl;

	glm::vec3 directionOfMovement(m_currentPosition - m_lastPosition);
	//std::cout << "(" << directionOfMovement.x << ", " << directionOfMovement.y << ", " << directionOfMovement.z << ")" << std::endl;
	glm::vec3 seperation(manifold.seperationVector);

	// Add displacement to axes that caused the collision
	bool collideX = false;
	if (directionOfMovement.x != 0) {
		glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f + directionOfMovement.x, m_lastPosition.y - 1.0f, m_lastPosition.z - 0.5f);
		glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f + directionOfMovement.x, m_lastPosition.y + 1.0f, m_lastPosition.z + 0.5f);
		AABBCollider playerCollider(playerMinPoint, playerMaxPoint);

		if (AABBCollider::checkCollision(playerCollider, blockCollider)) {
			collideX = true;
		}
	}

	bool collideY = false;
	if (directionOfMovement.y != 0) {
		glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f, m_lastPosition.y - 1.0f + directionOfMovement.y, m_lastPosition.z - 0.5f);
		glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f, m_lastPosition.y + 1.0f + directionOfMovement.y, m_lastPosition.z + 0.5f);
		AABBCollider playerCollider(playerMinPoint, playerMaxPoint);

		if (AABBCollider::checkCollision(playerCollider, blockCollider)) {
			collideY = true;
		}
	}

	bool collideZ = false;
	if (directionOfMovement.z != 0) {
		glm::vec3 playerMinPoint(m_lastPosition.x - 0.5f, m_lastPosition.y - 1.0f, m_lastPosition.z - 0.5f + directionOfMovement.z);
		glm::vec3 playerMaxPoint(m_lastPosition.x + 0.5f, m_lastPosition.y + 1.0f, m_lastPosition.z + 0.5f + directionOfMovement.z);
		AABBCollider playerCollider(playerMinPoint, playerMaxPoint);

		if (AABBCollider::checkCollision(playerCollider, blockCollider)) {
			collideZ = true;
		}
	}


	//// Only displace in the axes the player is moving in
	//if (abs(directionOfMovement.x) == 0) {
	//	seperation.x = 0;
	//}
	//if (abs(directionOfMovement.y) == 0) {
	//	seperation.y = 0;
	//}
	//if (abs(directionOfMovement.z) == 0) {
	//	seperation.z = 0;
	//}


	// Only displace in the axes that caused the collision
	if (collideX || collideY || collideZ) {
		if (!collideX) {
			seperation.x = 0;
		}
		if (!collideY) {
			seperation.y = 0;
		}
		if (!collideZ) {
			seperation.z = 0;
		}
	}
	
	// Choose the minimum axis
	float32 depth = 0;
	int32 axis = 0;
	for (int32 i = 0; i < 3; i++) {
		if (depth == 0) {
			depth = seperation[i];
			axis = i;
		}
		else {
			if (seperation[i] != 0 && (abs(seperation[i]) < abs(depth))) {
				depth = seperation[i];
				axis = i;
			}
		}
	}
	for (int32 i = 0; i < 3; i++) {
		if (i == axis) {
			seperation[i] = depth;
		}
		else {
			seperation[i] = 0;
		}
	}

	//if (abs(seperation.x) < abs(seperation.y)) {
	//	if (abs(seperation.x) < abs(seperation.z)) {
	//		// min is x
	//		seperation.y = 0;
	//		seperation.z = 0;
	//	}
	//	else {
	//		// min is z
	//		seperation.y = 0;
	//		seperation.x = 0;
	//	}
	//}
	//else {
	//	if (abs(seperation.y) < abs(seperation.z)) {
	//		// min is y
	//		seperation.x = 0;
	//		seperation.z = 0;
	//	}
	//	else {
	//		// min is z
	//		seperation.y = 0;
	//		seperation.x = 0;
	//	}
	//}

	//glm::vec3 displacement = glm::proj(seperation, -glm::normalize(directionOfMovement));
	glm::vec3 displacement = seperation;
	//std::cout << "(" << displacement.x << ", " << displacement.y << ", " << displacement.z << ")" << std::endl;
	
	// And just a hint of bias
	const static float32 bias = 0.0005f;
	if (abs(seperation.x) > 0) {
		displacement.x += signbit(seperation.x) ? -bias : bias;
	}
	if (abs(seperation.y) > 0) {
		displacement.y += signbit(seperation.y) ? -bias : bias;
	}
	if (abs(seperation.z) > 0) {
 		displacement.z += signbit(seperation.z) ? -bias : bias;
	}
	
	//m_lastPosition = m_currentPosition;
	transform.translate(displacement);
	m_currentPosition = glm::vec3(transform.xPos, transform.yPos, transform.zPos);

	if (displacement.y > 0) {
		// Stop!
		m_velocityY = 0;

		//m_glueToGround = true;
		
		// Just a hint of bias
		//transform.translate(0, 0.0005f, 0);
	}

	// If im moving in the positive x
	//if (directionOfMovement.x > 0) {
	//	
	//}
	//else if (directionOfMovement.x < 0) {
	//
	//}
	//else {
	//	displacement.x = 0;
	//}
	//
	//if (manifold.seperationVector.x == 0 && manifold.seperationVector.z == 0 && manifold.seperationVector.y > 0) {
	//	m_glueToGround = true;
	//
	//	// Stop!
	//	m_velocityY = 0;
	//	transform.translate(0, 0.0005f, 0); // HACK WARNING, Adding a bias here so I can get it to work for the demo
	//}
}