function Quaternion() {
	Object.defineProperties(this, {
		'x': { enumerable: true, configurable: true, get: Quaternion.prototype.__get_x, set: Quaternion.prototype.__set_x},
		'y': { enumerable: true, configurable: true, get: Quaternion.prototype.__get_y, set: Quaternion.prototype.__set_y},
		'z': { enumerable: true, configurable: true, get: Quaternion.prototype.__get_z, set: Quaternion.prototype.__set_z},
		'w': { enumerable: true, configurable: true, get: Quaternion.prototype.__get_w, set: Quaternion.prototype.__set_w}
	})
}
Quaternion.prototype.__get_x = function() {
	return Polycode.Quaternion__get_x(this.__ptr)
}

Quaternion.prototype.__set_x = function(val) {
	Polycode.Quaternion__set_x(this.__ptr, val)
}

Quaternion.prototype.__get_y = function() {
	return Polycode.Quaternion__get_y(this.__ptr)
}

Quaternion.prototype.__set_y = function(val) {
	Polycode.Quaternion__set_y(this.__ptr, val)
}

Quaternion.prototype.__get_z = function() {
	return Polycode.Quaternion__get_z(this.__ptr)
}

Quaternion.prototype.__set_z = function(val) {
	Polycode.Quaternion__set_z(this.__ptr, val)
}

Quaternion.prototype.__get_w = function() {
	return Polycode.Quaternion__get_w(this.__ptr)
}

Quaternion.prototype.__set_w = function(val) {
	Polycode.Quaternion__set_w(this.__ptr, val)
}

Duktape.fin(Quaternion.prototype, function (x) {
	if (x === Quaternion.prototype) {
		return;
	}
	Polycode.Quaternion__delete(x.__ptr)
})

Quaternion.prototype.setFromMatrix = function(_mat) {
	Polycode.Quaternion_setFromMatrix(this.__ptr, _mat)
}

Quaternion.prototype.Dot = function(rkQ) {
	return Polycode.Quaternion_Dot(this.__ptr, rkQ)
}

Quaternion.prototype.Log = function() {
	var retVal = new Quaternion()
	retVal.__ptr = Polycode.Quaternion_Log(this.__ptr)
	return retVal
}

Quaternion.prototype.Exp = function() {
	var retVal = new Quaternion()
	retVal.__ptr = Polycode.Quaternion_Exp(this.__ptr)
	return retVal
}

Quaternion.prototype.Norm = function() {
	return Polycode.Quaternion_Norm(this.__ptr)
}

Quaternion.prototype.Normalize = function() {
	return Polycode.Quaternion_Normalize(this.__ptr)
}

Quaternion.prototype.lookAt = function(D,upVector) {
	Polycode.Quaternion_lookAt(this.__ptr, D,upVector)
}

Quaternion.prototype.createFromMatrix = function(matrix) {
	Polycode.Quaternion_createFromMatrix(this.__ptr, matrix)
}

Quaternion.prototype.Inverse = function() {
	var retVal = new Quaternion()
	retVal.__ptr = Polycode.Quaternion_Inverse(this.__ptr)
	return retVal
}

Quaternion.prototype.set = function(w,x,y,z) {
	Polycode.Quaternion_set(this.__ptr, w,x,y,z)
}

Quaternion.prototype.InvSqrt = function(x) {
	return Polycode.Quaternion_InvSqrt(this.__ptr, x)
}

Quaternion.prototype.fromAxes = function(az,ay,ax) {
	Polycode.Quaternion_fromAxes(this.__ptr, az,ay,ax)
}

Quaternion.prototype.fromAngleAxis = function(rfAngle,rkAxis) {
	Polycode.Quaternion_fromAngleAxis(this.__ptr, rfAngle,rkAxis)
}

Quaternion.prototype.toEulerAngles = function() {
	var retVal = new Vector3()
	retVal.__ptr = Polycode.Quaternion_toEulerAngles(this.__ptr)
	return retVal
}

Quaternion.prototype.toAngleAxis = function(rfAngle,rkAxis) {
	Polycode.Quaternion_toAngleAxis(this.__ptr, rfAngle,rkAxis)
}

Quaternion.prototype.createFromAxisAngle = function(x,y,z,degrees) {
	Polycode.Quaternion_createFromAxisAngle(this.__ptr, x,y,z,degrees)
}

Quaternion.prototype.createMatrix = function() {
	var retVal = new Matrix4()
	retVal.__ptr = Polycode.Quaternion_createMatrix(this.__ptr)
	return retVal
}

Quaternion.prototype.applyTo = function(v) {
	var retVal = new Vector3()
	retVal.__ptr = Polycode.Quaternion_applyTo(this.__ptr, v)
	return retVal
}
