]> de.git.xonotic.org Git - xonotic/gmqcc.git/blobdiff - gmqcc.h
Merging master
[xonotic/gmqcc.git] / gmqcc.h
diff --git a/gmqcc.h b/gmqcc.h
index 0ba02deaa9d6740095ffccfdd71422cb5d25c2c5..99c12f56d1520b5d02ff03e6d241e87d7126d8fa 100644 (file)
--- a/gmqcc.h
+++ b/gmqcc.h
@@ -365,6 +365,8 @@ enum {
     TYPE_FUNCTION ,
     TYPE_POINTER  ,
     /* TYPE_INTEGER  , */
+    TYPE_QUATERNION  ,
+    TYPE_MATRIX  ,
     TYPE_VARIANT  ,
 
     TYPE_COUNT
@@ -463,8 +465,11 @@ enum {
     INSTR_DONE,
     INSTR_MUL_F,
     INSTR_MUL_V,
-    INSTR_MUL_FV,
     INSTR_MUL_VF,
+    INSTR_MUL_Q,
+    INSTR_MUL_QF,
+    INSTR_MUL_M,
+    INSTR_MUL_MF,
     INSTR_DIV_F,
     INSTR_ADD_F,
     INSTR_ADD_V,
@@ -475,11 +480,15 @@ enum {
     INSTR_EQ_S,
     INSTR_EQ_E,
     INSTR_EQ_FNC,
+    INSTR_EQ_Q,
+    INSTR_EQ_M,
     INSTR_NE_F,
     INSTR_NE_V,
     INSTR_NE_S,
     INSTR_NE_E,
     INSTR_NE_FNC,
+    INSTR_NE_Q,
+    INSTR_NE_M,
     INSTR_LE,
     INSTR_GE,
     INSTR_LT,
@@ -490,6 +499,8 @@ enum {
     INSTR_LOAD_ENT,
     INSTR_LOAD_FLD,
     INSTR_LOAD_FNC,
+    INSTR_LOAD_Q,
+    INSTR_LOAD_M,
     INSTR_ADDRESS,
     INSTR_STORE_F,
     INSTR_STORE_V,
@@ -497,18 +508,24 @@ enum {
     INSTR_STORE_ENT,
     INSTR_STORE_FLD,
     INSTR_STORE_FNC,
+    INSTR_STORE_Q,
+    INSTR_STORE_M,
     INSTR_STOREP_F,
     INSTR_STOREP_V,
     INSTR_STOREP_S,
     INSTR_STOREP_ENT,
     INSTR_STOREP_FLD,
     INSTR_STOREP_FNC,
+    INSTR_STOREP_Q,
+    INSTR_STOREP_M,
     INSTR_RETURN,
     INSTR_NOT_F,
     INSTR_NOT_V,
     INSTR_NOT_S,
     INSTR_NOT_ENT,
     INSTR_NOT_FNC,
+    INSTR_INV_Q,
+    INSTR_INV_M,
     INSTR_IF,
     INSTR_IFNOT,
     INSTR_CALL0,
@@ -582,8 +599,11 @@ static const struct {
     { "DONE"      , 1, 4 },
     { "MUL_F"     , 3, 5 },
     { "MUL_V"     , 3, 5 },
-    { "MUL_FV"    , 3, 6 },
     { "MUL_VF"    , 3, 6 },
+    { "MUL_Q"     , 3, 5 },
+    { "MUL_QF"    , 3, 6 },
+    { "MUL_M"     , 3, 5 },
+    { "MUL_MF"    , 3, 6 },
     { "DIV"       , 0, 3 },
     { "ADD_F"     , 3, 5 },
     { "ADD_V"     , 3, 5 },
@@ -594,11 +614,15 @@ static const struct {
     { "EQ_S"      , 0, 4 },
     { "EQ_E"      , 0, 4 },
     { "EQ_FNC"    , 0, 6 },
+    { "EQ_Q"      , 0, 4 },
+    { "EQ_M"      , 0, 4 },
     { "NE_F"      , 0, 4 },
     { "NE_V"      , 0, 4 },
     { "NE_S"      , 0, 4 },
     { "NE_E"      , 0, 4 },
     { "NE_FNC"    , 0, 6 },
+    { "NE_Q"      , 0, 4 },
+    { "NE_M"      , 0, 4 },
     { "LE"        , 0, 2 },
     { "GE"        , 0, 2 },
     { "LT"        , 0, 2 },
@@ -609,6 +633,8 @@ static const struct {
     { "FIELD_ENT" , 0, 9 },
     { "FIELD_FLD" , 0, 9 },
     { "FIELD_FNC" , 0, 9 },
+    { "FIELD_Q"   , 0, 7 },
+    { "FIELD_M"   , 0, 7 },
     { "ADDRESS"   , 0, 7 },
     { "STORE_F"   , 0, 7 },
     { "STORE_V"   , 0, 7 },
@@ -616,18 +642,24 @@ static const struct {
     { "STORE_ENT" , 0, 9 },
     { "STORE_FLD" , 0, 9 },
     { "STORE_FNC" , 0, 9 },
+    { "STORE_Q"   , 0, 7 },
+    { "STORE_M"   , 0, 7 },
     { "STOREP_F"  , 0, 8 },
     { "STOREP_V"  , 0, 8 },
     { "STOREP_S"  , 0, 8 },
     { "STOREP_ENT", 0, 10},
     { "STOREP_FLD", 0, 10},
     { "STOREP_FNC", 0, 10},
+    { "STOREP_Q"  , 0, 8 },
+    { "STOREP_M"  , 0, 8 },
     { "RETURN"    , 0, 6 },
     { "NOT_F"     , 0, 5 },
     { "NOT_V"     , 0, 5 },
     { "NOT_S"     , 0, 5 },
     { "NOT_ENT"   , 0, 7 },
     { "NOT_FNC"   , 0, 7 },
+    { "INV_Q"     , 0, 5 },
+    { "INV_M"     , 0, 5 },
     { "IF"        , 0, 2 },
     { "IFNOT"     , 0, 5 },
     { "CALL0"     , 1, 5 },
@@ -789,6 +821,14 @@ typedef struct {
     float x, y, z;
 } vector;
 
+typedef float matrix[4][4]; /* OpenGL layout */
+typedef float quaternion[4]; /* order: x, y, z, w */
+#define MATRIX(axis, elem) ((4*(axis)) + (elem))
+#define QUAT_X 0
+#define QUAT_Y 1
+#define QUAT_Z 2
+#define QUAT_W 3
+
 /*
  * A shallow copy of a lex_file to remember where which ast node
  * came from.