added quat class
upped version to v0.2 --HG-- branch : py3dutil
This commit is contained in:
parent
1b8f548735
commit
40b2fd87f3
5 changed files with 93 additions and 16 deletions
18
py3dutil.c
18
py3dutil.c
|
@ -1,6 +1,7 @@
|
|||
#include "obarr.h"
|
||||
/*#include "cgrid.h"*/
|
||||
#include "vect.h"
|
||||
#include "quat.h"
|
||||
|
||||
|
||||
static PyMethodDef ModMethods[] = {
|
||||
|
@ -13,14 +14,17 @@ initpy3dutil(void)
|
|||
PyObject* m;
|
||||
|
||||
ObarrObjectType.tp_new = PyType_GenericNew;
|
||||
/*CgridObjectType.tp_new = PyType_GenericNew;*/
|
||||
VectObjectType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&ObarrObjectType) < 0)
|
||||
return;
|
||||
/*if (PyType_Ready(&CgridObjectType) < 0)
|
||||
/*CgridObjectType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&CgridObjectType) < 0)
|
||||
return;*/
|
||||
VectObjectType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&VectObjectType) < 0)
|
||||
return;
|
||||
QuatObjectType.tp_new = PyType_GenericNew;
|
||||
if (PyType_Ready(&QuatObjectType) < 0)
|
||||
return;
|
||||
|
||||
(void) Py_InitModule("py3dutil", ModMethods);
|
||||
m = Py_InitModule3("py3dutil", NULL,
|
||||
|
@ -29,9 +33,11 @@ initpy3dutil(void)
|
|||
return;
|
||||
|
||||
Py_INCREF(&ObarrObjectType);
|
||||
/*Py_INCREF(&CgridObjectType);*/
|
||||
Py_INCREF(&VectObjectType);
|
||||
PyModule_AddObject(m, "obarr", (PyObject *)&ObarrObjectType);
|
||||
/*PyModule_AddObject(m, "cgrid", (PyObject *)&CgridObjectType);*/
|
||||
/*Py_INCREF(&CgridObjectType);
|
||||
PyModule_AddObject(m, "cgrid", (PyObject *)&CgridObjectType);*/
|
||||
Py_INCREF(&VectObjectType);
|
||||
PyModule_AddObject(m, "vect", (PyObject *)&VectObjectType);
|
||||
Py_INCREF(&QuatObjectType);
|
||||
PyModule_AddObject(m, "quat", (PyObject *)&QuatObjectType);
|
||||
}
|
||||
|
|
59
quat.h
Normal file
59
quat.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
#include <Python.h>
|
||||
#include <structmember.h>
|
||||
#include "vect.h"
|
||||
|
||||
#if PY_VERSION_HEX < 0x02050000 && !defined(PY_SSIZE_T_MIN)
|
||||
typedef int Py_ssize_t;
|
||||
#define PY_SSIZE_T_MAX INT_MAX
|
||||
#define PY_SSIZE_T_MIN INT_MIN
|
||||
#endif
|
||||
|
||||
typedef struct QuatObject {
|
||||
PyObject_HEAD
|
||||
double elements[4];
|
||||
} QuatObject;
|
||||
|
||||
|
||||
#define Quat_Check(op) PyObject_TypeCheck(op, &QuatObjectType)
|
||||
|
||||
// internal functions
|
||||
PyObject* quat_get_element(PyObject* self_in, long index);
|
||||
void quat_multiply_internal(QuatObject* q1, QuatObject* q2, QuatObject* qr);
|
||||
void quat_multiply_vect_internal(QuatObject* self, VectObject* v, VectObject* rv);
|
||||
double quat_mag_internal(QuatObject* self);
|
||||
double quat_mag2_internal(QuatObject* self);
|
||||
void quat_normalize_internal(QuatObject* self);
|
||||
void quat_get_conjugate_internal(QuatObject* self, QuatObject* rv);
|
||||
|
||||
// Python API functions
|
||||
int Quat_init(QuatObject *self, PyObject *args, PyObject *kwds);
|
||||
PyObject* Quat_getx(PyObject* self_in, void* closure);
|
||||
PyObject* Quat_gety(PyObject* self_in, void* closure);
|
||||
PyObject* Quat_getz(PyObject* self_in, void* closure);
|
||||
PyObject* Quat_getw(PyObject* self_in, void* closure);
|
||||
int Quat_set_notallowed(PyObject* self_in, PyObject* value, void* closure);
|
||||
PyObject* Quat_repr(PyObject *self_in);
|
||||
int Quat_true(PyObject *self_in);
|
||||
PyObject* Quat_mul(PyObject *self_in, PyObject *other_in);
|
||||
PyObject* Quat_ip_normalize(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_mag(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_mag2(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_copy(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_get_angle(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_get_conjugate(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_get_matrix(PyObject *self_in, PyObject *unused);
|
||||
PyObject* Quat_slerp(PyObject *self_in, PyObject *args);
|
||||
PyObject* Quat_slerp_turn(PyObject *self_in, PyObject *args);
|
||||
Py_ssize_t Quat_len(PyObject *self_in);
|
||||
PyObject* Quat_item(PyObject *self_in, Py_ssize_t index);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
extern PyNumberMethods Quat_as_number[];
|
||||
extern PySequenceMethods Quat_as_seq[];
|
||||
extern PyGetSetDef Quat_getset[];
|
||||
extern PyMethodDef Quat_methods[];
|
||||
extern struct PyMemberDef Quat_members[];
|
||||
extern PyTypeObject QuatObjectType;
|
4
setup.py
4
setup.py
|
@ -2,7 +2,7 @@ from distutils.core import setup, Extension
|
|||
from cPickle import load, dump
|
||||
import os
|
||||
|
||||
module1 = Extension('py3dutil', sources = ['py3dutil.c', 'obarr.c', 'red_black_tree.c', 'misc.c', 'vect.c'])
|
||||
module1 = Extension('py3dutil', sources = ['py3dutil.c', 'obarr.c', 'red_black_tree.c', 'misc.c', 'vect.c', 'quat.c'])
|
||||
|
||||
buildno = 0
|
||||
if os.path.exists('buildno'):
|
||||
|
@ -11,7 +11,7 @@ if os.path.exists('buildno'):
|
|||
dump(buildno, open('buildno', 'wb'))
|
||||
|
||||
setup (name = 'py3dutil',
|
||||
version = '0.1.%.4d' % (buildno,),
|
||||
version = '0.2.%.4d' % (buildno,),
|
||||
description = 'Accelerator library for 3d games',
|
||||
author = 'Bradley Lawrence',
|
||||
author_email = 'py3dutil@iambitter.org',
|
||||
|
|
22
vect.c
22
vect.c
|
@ -375,11 +375,22 @@ PyObject* Vect_mag2(PyObject *self_in, PyObject *unused)
|
|||
return PyFloat_FromDouble(d);
|
||||
}
|
||||
|
||||
double vect_dotprod_internal(VectObject *self, VectObject *other)
|
||||
{
|
||||
int i;
|
||||
double d = 0.0;
|
||||
for (i = 0; i < VECLEN; i++)
|
||||
d += self->elements[i] * other->elements[i];
|
||||
if (d >= 1.0)
|
||||
return 0.0;
|
||||
|
||||
return acos(d);
|
||||
}
|
||||
|
||||
PyObject* Vect_dotprod(PyObject *self_in, PyObject *args)
|
||||
{
|
||||
VectObject *self, *other;
|
||||
double d;
|
||||
long i;
|
||||
if (!Vect_Check(self_in))
|
||||
{
|
||||
PyErr_SetString(PyExc_TypeError, "not a vector");
|
||||
|
@ -398,13 +409,8 @@ PyObject* Vect_dotprod(PyObject *self_in, PyObject *args)
|
|||
return math.acos(value) * 180.0 / math.pi
|
||||
*/
|
||||
|
||||
d = 0.0;
|
||||
for (i = 0; i < VECLEN; i++)
|
||||
d += self->elements[i] * other->elements[i];
|
||||
if (d >= 1.0)
|
||||
return PyFloat_FromDouble(0.0);
|
||||
|
||||
return PyFloat_FromDouble(acos(d) * RAD2DEG);
|
||||
d = vect_dotprod_internal(self, other) * RAD2DEG;
|
||||
return PyFloat_FromDouble(d);
|
||||
}
|
||||
|
||||
#define A1 self->elements[0]
|
||||
|
|
6
vect.h
6
vect.h
|
@ -1,3 +1,6 @@
|
|||
#ifndef VECT_H_INCLUDED
|
||||
#define VECT_H_INCLUDED
|
||||
|
||||
#include <Python.h>
|
||||
#include <structmember.h>
|
||||
|
||||
|
@ -29,6 +32,7 @@ typedef struct VectObject {
|
|||
|
||||
// internal functions
|
||||
PyObject* vect_get_element(PyObject* self_in, long index);
|
||||
double vect_dotprod_internal(VectObject *self, VectObject *other);
|
||||
|
||||
// Python API functions
|
||||
int Vect_init(VectObject *self, PyObject *args, PyObject *kwds);
|
||||
|
@ -75,3 +79,5 @@ extern PyGetSetDef Vect_getset[];
|
|||
extern PyMethodDef Vect_methods[];
|
||||
extern struct PyMemberDef Vect_members[];
|
||||
extern PyTypeObject VectObjectType;
|
||||
|
||||
#endif
|
Loading…
Add table
Reference in a new issue