Exemple #1
0
vector<int> Lattice::getIndex(int num) const
{
    vector<int> base = _range_width;
    base.push_back( _atom_num_in_cell );
    vector<int> res = base_transform(num, base);
    for(int i=0; i<_dimension; ++i)
        res[i] += _range[i].first;
    return res;
}
Exemple #2
0
	void MSceneMessage_AfterImportOpen_CallbackFunc(void *callbackData) {
		MStatus status;

		MItDag it(MItDag::kBreadthFirst, MFn::kTransform, &status);

		if (!status) {
			status.perror("MItDag::#ctor");
			return;
		}

		for(; !it.isDone(); it.next()) {
			MObject object = it.item(&status);

			if (!status) {
				status.perror("MObject::item");
				return;
			}

			/*
			 * Make sure the object is a Helix
			 */

			MFnDagNode dagNode(object);

			if (dagNode.typeId(&status) == ::Helix::Helix::id) {
				/*
				 * This object is a helix, iterate over all of its bases and set their translation
				 */

				Model::Helix helix(object);

				for(Model::Helix::BaseIterator it = helix.begin(); it != helix.end(); ++it) {
					MFnTransform base_transform(it->getDagPath(status));

					if (!status) {
						status.perror("MFnTransform::getDagPath");
						return;
					}

					MVector translation = base_transform.getTranslation(MSpace::kTransform, &status);

					if (!status) {
						status.perror("MFnTransform::getTranslation");
						return;
					}

					if (!(status = base_transform.setTranslation(translation, MSpace::kTransform))) {
						status.perror("MFnTransform::setTranslation");
						return;
					}
				}
			}
		}
	}
weight_slider::weight_slider(const float3& position_, const float& height_, const float& mass_) :
position(position_), height(height_), mass(mass_)
{
	//
	avg_norm_height.fill(1.0f);
	
	// create slider bodies (base is fixed/static, tray is dynamic)
	constexpr float body_height = 0.025f;
	base_info = &pc->add_rigid_info<physics_controller::SHAPE::BOX>(0.0f, float3(0.5f, body_height, 0.5f));
	tray_info = &pc->add_rigid_info<physics_controller::SHAPE::BOX>(mass, float3(0.5f, body_height, 0.5f));
	base_body = &pc->add_rigid_body(*base_info, position + float3(0.5f, 0.0f, 0.5f));
	tray_body = &pc->add_rigid_body(*tray_info, position + float3(0.5f, height, 0.5f));
	
	//
	btTransform base_transform(btTransform::getIdentity());
	btTransform tray_transform(btTransform::getIdentity());
	base_transform.getBasis().setValue(0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
	tray_transform.getBasis().setValue(0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f);
	tray_transform.setOrigin(btVector3(0.0f, height - 0.1f, 0.0f));
	constraint = new btSliderConstraint(*base_body->get_body(), *tray_body->get_body(),
										base_transform, tray_transform, true);
	
	constraint->setLowerLinLimit(0.0f);
	constraint->setUpperLinLimit(height);
	constraint->setPoweredLinMotor(true);
	constraint->setTargetLinMotorVelocity(100.0f);
	constraint->setMaxLinMotorForce(100.0f);
	
	// disable any angular rotation
	constraint->setLowerAngLimit(0.0f);
	constraint->setUpperAngLimit(0.0f);
	constraint->setSoftnessDirAng(0.0f);
	constraint->setRestitutionDirAng(0.0f);
	constraint->setDampingDirAng(0.0f);
	constraint->setSoftnessLimAng(0.0f);
	constraint->setRestitutionLimAng(0.0f);
	constraint->setDampingLimAng(0.0f);
	constraint->setSoftnessOrthoAng(0.0f);
	constraint->setRestitutionOrthoAng(0.0f);
	constraint->setDampingOrthoAng(0.0f);
	constraint->setPoweredAngMotor(false);
	
	// body rotation must also be disabled (+disable deactivation)
	base_body->get_body()->setActivationState(DISABLE_DEACTIVATION);
	base_body->get_body()->setSleepingThresholds(0.0f, 0.0f);
	base_body->get_body()->setAngularFactor(0.0f);
	tray_body->get_body()->setActivationState(DISABLE_DEACTIVATION);
	tray_body->get_body()->setSleepingThresholds(0.0f, 0.0f);
	tray_body->get_body()->setAngularFactor(0.0f);
}