mirror of
https://github.com/KevinMidboe/linguist.git
synced 2025-10-29 17:50:22 +00:00
Merge pull request #1627 from github/1036-local
Disambiguate C, C++, Objective-C
This commit is contained in:
@@ -61,6 +61,15 @@ module Linguist
|
|||||||
@heuristic.call(data)
|
@heuristic.call(data)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
disambiguate "Objective-C", "C++", "C" do |data|
|
||||||
|
if (/@(interface|class|protocol|property|end|synchronised|selector|implementation)\b/.match(data))
|
||||||
|
Language["Objective-C"]
|
||||||
|
elsif (/^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>/.match(data) ||
|
||||||
|
/^\s*template\s*</.match(data) || /^[^@]class\s+\w+/.match(data) || /^[^@](private|public|protected):$/.match(data) || /std::.+$/.match(data))
|
||||||
|
Language["C++"]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
disambiguate "Perl", "Prolog" do |data|
|
disambiguate "Perl", "Prolog" do |data|
|
||||||
if data.include?("use strict")
|
if data.include?("use strict")
|
||||||
Language["Perl"]
|
Language["Perl"]
|
||||||
|
|||||||
@@ -308,6 +308,8 @@ C:
|
|||||||
color: "#555"
|
color: "#555"
|
||||||
extensions:
|
extensions:
|
||||||
- .c
|
- .c
|
||||||
|
- .C
|
||||||
|
- .H
|
||||||
- .cats
|
- .cats
|
||||||
- .h
|
- .h
|
||||||
- .idc
|
- .idc
|
||||||
@@ -335,9 +337,6 @@ C++:
|
|||||||
- cpp
|
- cpp
|
||||||
extensions:
|
extensions:
|
||||||
- .cpp
|
- .cpp
|
||||||
- .C
|
|
||||||
- .CPP
|
|
||||||
- .H
|
|
||||||
- .c++
|
- .c++
|
||||||
- .cc
|
- .cc
|
||||||
- .cxx
|
- .cxx
|
||||||
|
|||||||
86
samples/C++/16F88.h
Normal file
86
samples/C++/16F88.h
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of PIC
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* PIC is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PIC is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
enum PIC16F88Instruction
|
||||||
|
{
|
||||||
|
ADDWF,
|
||||||
|
ANDWF,
|
||||||
|
CLRF,
|
||||||
|
CLRW,
|
||||||
|
COMF,
|
||||||
|
DECF,
|
||||||
|
DECFSZ,
|
||||||
|
INCF,
|
||||||
|
INCFSZ,
|
||||||
|
IORWF,
|
||||||
|
MOVF,
|
||||||
|
MOVWF,
|
||||||
|
NOP,
|
||||||
|
RLF,
|
||||||
|
RRF,
|
||||||
|
SUBWF,
|
||||||
|
SWAPF,
|
||||||
|
XORWF,
|
||||||
|
BCF,
|
||||||
|
BSF,
|
||||||
|
BTFSC,
|
||||||
|
BTFSS,
|
||||||
|
ADDLW,
|
||||||
|
ANDLW,
|
||||||
|
CALL,
|
||||||
|
CLRWDT,
|
||||||
|
GOTO,
|
||||||
|
IORLW,
|
||||||
|
MOVLW,
|
||||||
|
RETFIE,
|
||||||
|
RETLW,
|
||||||
|
RETURN,
|
||||||
|
SLEEP,
|
||||||
|
SUBLW,
|
||||||
|
XORLW
|
||||||
|
};
|
||||||
|
|
||||||
|
class PIC16F88
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PIC16F88(ROM *ProgramMemory);
|
||||||
|
void Step();
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint8_t q;
|
||||||
|
bool nextIsNop, trapped;
|
||||||
|
Memory *memory;
|
||||||
|
ROM *program;
|
||||||
|
Stack<uint16_t, 8> *CallStack;
|
||||||
|
Register<uint16_t> *PC;
|
||||||
|
Register<> *WREG, *PCL, *STATUS, *PCLATCH;
|
||||||
|
PIC16F88Instruction inst;
|
||||||
|
uint16_t instrWord;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void DecodeInstruction();
|
||||||
|
void ProcessInstruction();
|
||||||
|
|
||||||
|
uint8_t GetBank();
|
||||||
|
uint8_t GetMemoryContents(uint8_t partialAddress);
|
||||||
|
void SetMemoryContents(uint8_t partialAddress, uint8_t newVal);
|
||||||
|
void CheckZero(uint8_t value);
|
||||||
|
void StoreValue(uint8_t value, bool updateZero);
|
||||||
|
uint8_t SetCarry(bool val);
|
||||||
|
uint16_t GetPCHFinalBits();
|
||||||
|
};
|
||||||
32
samples/C++/Memory16F88.h
Normal file
32
samples/C++/Memory16F88.h
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of PIC
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* PIC is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* PIC is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "Memory.h"
|
||||||
|
|
||||||
|
class Memory16F88 : public Memory
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
uint8_t memory[512];
|
||||||
|
std::map<uint32_t, MemoryLocation *> memoryMap;
|
||||||
|
|
||||||
|
public:
|
||||||
|
Memory16F88();
|
||||||
|
uint8_t Dereference(uint8_t bank, uint8_t partialAddress);
|
||||||
|
uint8_t *Reference(uint8_t bank, uint8_t partialAddress);
|
||||||
|
uint8_t *operator [](uint32_t ref);
|
||||||
|
};
|
||||||
76
samples/C++/ThreadedQueue.h
Normal file
76
samples/C++/ThreadedQueue.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of IRCBot
|
||||||
|
* Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* IRCBot is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* IRCBot is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __THREADED_QUEUE_H__
|
||||||
|
#define __THREADED_QUEUE_H__
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <queue>
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
class ThreadedQueue : public std::queue<T>
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
pthread_mutex_t queueMutex;
|
||||||
|
pthread_cond_t queueCond;
|
||||||
|
|
||||||
|
public:
|
||||||
|
ThreadedQueue()
|
||||||
|
{
|
||||||
|
pthread_mutexattr_t mutexAttrs;
|
||||||
|
pthread_condattr_t condAttrs;
|
||||||
|
|
||||||
|
pthread_mutexattr_init(&mutexAttrs);
|
||||||
|
pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK);
|
||||||
|
pthread_mutex_init(&queueMutex, &mutexAttrs);
|
||||||
|
pthread_mutexattr_destroy(&mutexAttrs);
|
||||||
|
|
||||||
|
pthread_condattr_init(&condAttrs);
|
||||||
|
pthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE);
|
||||||
|
pthread_cond_init(&queueCond, &condAttrs);
|
||||||
|
pthread_condattr_destroy(&condAttrs);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ThreadedQueue()
|
||||||
|
{
|
||||||
|
pthread_cond_destroy(&queueCond);
|
||||||
|
pthread_mutex_destroy(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void waitItems()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&queueMutex);
|
||||||
|
pthread_cond_wait(&queueCond, &queueMutex);
|
||||||
|
pthread_mutex_unlock(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void signalItems()
|
||||||
|
{
|
||||||
|
pthread_mutex_lock(&queueMutex);
|
||||||
|
pthread_cond_broadcast(&queueCond);
|
||||||
|
pthread_mutex_unlock(&queueMutex);
|
||||||
|
}
|
||||||
|
|
||||||
|
void push(T item)
|
||||||
|
{
|
||||||
|
std::queue<T>::push(item);
|
||||||
|
signalItems();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif /*__THREADED_QUEUE_H__*/
|
||||||
145
samples/C/2D.C
Normal file
145
samples/C/2D.C
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
#include "2D.h"
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
void set_vgabasemem(void)
|
||||||
|
{
|
||||||
|
ULONG vgabase;
|
||||||
|
SELECTOR tmp;
|
||||||
|
asm mov [tmp], ds
|
||||||
|
dpmi_get_sel_base(&vgabase, tmp);
|
||||||
|
vgabasemem = (char *)(-vgabase + 0xa0000);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_chdis(int mode) // change the display!
|
||||||
|
{
|
||||||
|
regs.b.ah = 0x00; // seet theh display moode
|
||||||
|
regs.b.al = mode; // change it to the mode like innit
|
||||||
|
regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh?
|
||||||
|
regs.h.ss = 0; // Like, totally set the stack segment
|
||||||
|
regs.h.sp = 0; // Set tha stack pointaaaaahhhhh!!!
|
||||||
|
dpmi_simulate_real_interrupt(0x10, ®s);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_pix(int x, int y, enum COLORS col)
|
||||||
|
{
|
||||||
|
*VGAPIX(x, y) = col;
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_line(int x0, int y0, int x1, int y1, enum COLORS col)
|
||||||
|
{
|
||||||
|
// Going for the optimized version of bresenham's line algo.
|
||||||
|
int stp = (abs(y0 - y1) > abs(x0 - x1));
|
||||||
|
int tmp, dx, dy, err, yi, i, j; // yi = y excrement
|
||||||
|
if (stp) {
|
||||||
|
// swappity swap
|
||||||
|
tmp = y0;
|
||||||
|
y0 = x0;
|
||||||
|
x0 = tmp;
|
||||||
|
|
||||||
|
tmp = y1;
|
||||||
|
y1 = x1;
|
||||||
|
x1 = tmp;
|
||||||
|
}
|
||||||
|
// AAAAND NOW WE MUST DO ZEES AGAIN :(
|
||||||
|
// I'm sure there was a func somewhere that does this? :P
|
||||||
|
if (x0 > x1) {
|
||||||
|
tmp = x0;
|
||||||
|
x0 = x1;
|
||||||
|
x1 = tmp;
|
||||||
|
|
||||||
|
tmp = y0;
|
||||||
|
y0 = y1;
|
||||||
|
y1 = tmp;
|
||||||
|
}
|
||||||
|
dx = (x1 - x0);
|
||||||
|
dy = (abs(y1 - y0));
|
||||||
|
err = (dx / 2);
|
||||||
|
|
||||||
|
if (y0 < y1)
|
||||||
|
yi = 1;
|
||||||
|
else
|
||||||
|
yi = -1;
|
||||||
|
j = y0;
|
||||||
|
for (i = x0; i < x1; i++)
|
||||||
|
{
|
||||||
|
if (stp)
|
||||||
|
*VGAPIX(j, i) = col;
|
||||||
|
else
|
||||||
|
*VGAPIX(i, j) = col;
|
||||||
|
|
||||||
|
err -= dy;
|
||||||
|
if (err < 0) {
|
||||||
|
j += yi;
|
||||||
|
err += dx;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_rectl(int x, int y, int w, int h, enum COLORS col)
|
||||||
|
{
|
||||||
|
drw_line(x, y, x+w, y, col);
|
||||||
|
drw_line(x+w, y, x+w, y+h, col);
|
||||||
|
|
||||||
|
drw_line(x, y, x, y+h, col);
|
||||||
|
drw_line(x, y+h, x+w+1, y+h, col);
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_rectf(int x, int y, int w, int h, enum COLORS col)
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
for (j = y; j < x+h; j++) {
|
||||||
|
for (i = x; i < y+w; i++) {
|
||||||
|
*VGAPIX(i, j) = col;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_circl(int x, int y, int rad, enum COLORS col)
|
||||||
|
{
|
||||||
|
int mang, i; // max angle, haha
|
||||||
|
int px, py;
|
||||||
|
mang = 360; // Yeah yeah I'll switch to rad later
|
||||||
|
for (i = 0; i <= mang; i++)
|
||||||
|
{
|
||||||
|
px = cos(i)*rad + x; // + px; // causes some really cools effects! :D
|
||||||
|
py = sin(i)*rad + y; // + py;
|
||||||
|
*VGAPIX(px, py) = col;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void drw_tex(int x, int y, int w, int h, enum COLORS tex[])
|
||||||
|
{ // i*w+j
|
||||||
|
int i, j;
|
||||||
|
for (i = 0; i < w; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < h; j++)
|
||||||
|
{
|
||||||
|
*VGAPIX(x+i, y+j) = tex[j*w+i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void 2D_init(void)
|
||||||
|
{
|
||||||
|
set_vgabasemem();
|
||||||
|
drw_chdis(0x13);
|
||||||
|
}
|
||||||
|
|
||||||
|
void 2D_exit(void)
|
||||||
|
{
|
||||||
|
drw_chdis(3);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
set_vgabasemem();
|
||||||
|
drw_chdis(0x13);
|
||||||
|
|
||||||
|
while(!kbhit()) {
|
||||||
|
if ((getch()) == 0x1b) // escape
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
drw_chdis(3);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
*/
|
||||||
29
samples/C/2D.H
Normal file
29
samples/C/2D.H
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
#ifndef __2DGFX
|
||||||
|
#define __2DGFX
|
||||||
|
// Includes
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <conio.h>
|
||||||
|
#include <dpmi.h>
|
||||||
|
|
||||||
|
// Defines
|
||||||
|
#define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320)
|
||||||
|
|
||||||
|
// Variables
|
||||||
|
char * vgabasemem;
|
||||||
|
DPMI_REGS regs;
|
||||||
|
|
||||||
|
// Drawing functions:
|
||||||
|
//void setvgabasemem(void);
|
||||||
|
void drw_chdis(int mode); // draw_func_change_display
|
||||||
|
void drw_pix(int x, int y, enum COLORS col);
|
||||||
|
void drw_line(int x0, int y0, int x1, int y1, enum COLORS col);
|
||||||
|
void drw_rectl(int x, int y, int w, int h, enum COLORS col);
|
||||||
|
void drw_rectf(int x, int y, int w, int h, enum COLORS col);
|
||||||
|
void drw_cirl(int x, int y, int rad, enum COLORS col);
|
||||||
|
void drw_tex(int x, int y, int w, int h, enum COLORS tex[]);
|
||||||
|
void 2D_init(void);
|
||||||
|
void 2D_exit(void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
||||||
93
samples/C/ArrowLeft.h
Normal file
93
samples/C/ArrowLeft.h
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of GTK++ (libGTK++)
|
||||||
|
* Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net)
|
||||||
|
*
|
||||||
|
* GTK++ is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU Lesser General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* GTK++ is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* GdkPixbuf RGBA C-Source image dump */
|
||||||
|
|
||||||
|
#ifdef __SUNPRO_C
|
||||||
|
#pragma align 4 (ArrowLeft)
|
||||||
|
#endif
|
||||||
|
#ifdef __GNUC__
|
||||||
|
static const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) =
|
||||||
|
#else
|
||||||
|
static const uint8_t ArrowLeft[] =
|
||||||
|
#endif
|
||||||
|
{ ""
|
||||||
|
/* Pixbuf magic (0x47646b50) */
|
||||||
|
"GdkP"
|
||||||
|
/* length: header (24) + pixel_data (1600) */
|
||||||
|
"\0\0\6X"
|
||||||
|
/* pixdata_type (0x1010002) */
|
||||||
|
"\1\1\0\2"
|
||||||
|
/* rowstride (80) */
|
||||||
|
"\0\0\0P"
|
||||||
|
/* width (20) */
|
||||||
|
"\0\0\0\24"
|
||||||
|
/* height (20) */
|
||||||
|
"\0\0\0\24"
|
||||||
|
/* pixel_data: */
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377"
|
||||||
|
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377"
|
||||||
|
"\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0"
|
||||||
|
"\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
|
||||||
|
"\0\0"};
|
||||||
|
|
||||||
|
|
||||||
903
samples/C/GLKMatrix4.h
Normal file
903
samples/C/GLKMatrix4.h
Normal file
@@ -0,0 +1,903 @@
|
|||||||
|
//
|
||||||
|
// GLKMatrix4.h
|
||||||
|
// GLKit
|
||||||
|
//
|
||||||
|
// Copyright (c) 2011, Apple Inc. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
#ifndef __GLK_MATRIX_4_H
|
||||||
|
#define __GLK_MATRIX_4_H
|
||||||
|
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <math.h>
|
||||||
|
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
#include <arm_neon.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <GLKit/GLKMathTypes.h>
|
||||||
|
#include <GLKit/GLKVector3.h>
|
||||||
|
#include <GLKit/GLKVector4.h>
|
||||||
|
#include <GLKit/GLKQuaternion.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Prototypes
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
|
extern const GLKMatrix4 GLKMatrix4Identity;
|
||||||
|
|
||||||
|
/*
|
||||||
|
m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]);
|
||||||
|
|
||||||
|
/*
|
||||||
|
row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,
|
||||||
|
GLKVector4 row1,
|
||||||
|
GLKVector4 row2,
|
||||||
|
GLKVector4 row3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
column3's first three components should correspond to the translation values tx, ty, and tz.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,
|
||||||
|
GLKVector4 column1,
|
||||||
|
GLKVector4 column2,
|
||||||
|
GLKVector4 column3);
|
||||||
|
|
||||||
|
/*
|
||||||
|
The quaternion will be normalized before conversion.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to gluPerspective.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to glFrustum.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to glOrtho.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Equivalent to gluLookAt.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,
|
||||||
|
float centerX, float centerY, float centerZ,
|
||||||
|
float upX, float upY, float upZ);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns the upper left 3x3 portion of the 4x4 matrix.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix);
|
||||||
|
/*
|
||||||
|
Returns the upper left 2x2 portion of the 4x4 matrix.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix);
|
||||||
|
|
||||||
|
/*
|
||||||
|
GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively.
|
||||||
|
Valid row values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row);
|
||||||
|
/*
|
||||||
|
GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz.
|
||||||
|
Valid column values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column);
|
||||||
|
|
||||||
|
/*
|
||||||
|
GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component.
|
||||||
|
Valid row values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector);
|
||||||
|
/*
|
||||||
|
GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively.
|
||||||
|
Valid column values range from 0 to 3, inclusive.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix);
|
||||||
|
|
||||||
|
GLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible);
|
||||||
|
GLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, translationVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, scaleVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector);
|
||||||
|
/*
|
||||||
|
The last component of the GLKVector4, axisVector, is ignored.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector);
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians);
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Assumes 0 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component and divides the resulting vector by w before returning.
|
||||||
|
*/
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Assumes 0 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
/*
|
||||||
|
Assumes 1 in the w component and divides the resulting vector by w before returning.
|
||||||
|
*/
|
||||||
|
static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount);
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight);
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount);
|
||||||
|
|
||||||
|
#pragma mark -
|
||||||
|
#pragma mark Implementations
|
||||||
|
#pragma mark -
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { m00, m01, m02, m03,
|
||||||
|
m10, m11, m12, m13,
|
||||||
|
m20, m21, m22, m23,
|
||||||
|
m30, m31, m32, m33 };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03,
|
||||||
|
float m10, float m11, float m12, float m13,
|
||||||
|
float m20, float m21, float m22, float m23,
|
||||||
|
float m30, float m31, float m32, float m33)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { m00, m10, m20, m30,
|
||||||
|
m01, m11, m21, m31,
|
||||||
|
m02, m12, m22, m32,
|
||||||
|
m03, m13, m23, m33 };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16])
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { values[0], values[1], values[2], values[3],
|
||||||
|
values[4], values[5], values[6], values[7],
|
||||||
|
values[8], values[9], values[10], values[11],
|
||||||
|
values[12], values[13], values[14], values[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16])
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m = vld4q_f32(values);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { values[0], values[4], values[8], values[12],
|
||||||
|
values[1], values[5], values[9], values[13],
|
||||||
|
values[2], values[6], values[10], values[14],
|
||||||
|
values[3], values[7], values[11], values[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0,
|
||||||
|
GLKVector4 row1,
|
||||||
|
GLKVector4 row2,
|
||||||
|
GLKVector4 row3)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0],
|
||||||
|
row0.v[1], row1.v[1], row2.v[1], row3.v[1],
|
||||||
|
row0.v[2], row1.v[2], row2.v[2], row3.v[2],
|
||||||
|
row0.v[3], row1.v[3], row2.v[3], row3.v[3] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0,
|
||||||
|
GLKVector4 column1,
|
||||||
|
GLKVector4 column2,
|
||||||
|
GLKVector4 column3)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m;
|
||||||
|
m.val[0] = vld1q_f32(column0.v);
|
||||||
|
m.val[1] = vld1q_f32(column1.v);
|
||||||
|
m.val[2] = vld1q_f32(column2.v);
|
||||||
|
m.val[3] = vld1q_f32(column3.v);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3],
|
||||||
|
column1.v[0], column1.v[1], column1.v[2], column1.v[3],
|
||||||
|
column2.v[0], column2.v[1], column2.v[2], column2.v[3],
|
||||||
|
column3.v[0], column3.v[1], column3.v[2], column3.v[3] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion)
|
||||||
|
{
|
||||||
|
quaternion = GLKQuaternionNormalize(quaternion);
|
||||||
|
|
||||||
|
float x = quaternion.q[0];
|
||||||
|
float y = quaternion.q[1];
|
||||||
|
float z = quaternion.q[2];
|
||||||
|
float w = quaternion.q[3];
|
||||||
|
|
||||||
|
float _2x = x + x;
|
||||||
|
float _2y = y + y;
|
||||||
|
float _2z = z + z;
|
||||||
|
float _2w = w + w;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 1.0f - _2y * y - _2z * z,
|
||||||
|
_2x * y + _2w * z,
|
||||||
|
_2x * z - _2w * y,
|
||||||
|
0.0f,
|
||||||
|
_2x * y - _2w * z,
|
||||||
|
1.0f - _2x * x - _2z * z,
|
||||||
|
_2y * z + _2w * x,
|
||||||
|
0.0f,
|
||||||
|
_2x * z + _2w * y,
|
||||||
|
_2y * z - _2w * x,
|
||||||
|
1.0f - _2x * x - _2y * y,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = GLKMatrix4Identity;
|
||||||
|
m.m[12] = tx;
|
||||||
|
m.m[13] = ty;
|
||||||
|
m.m[14] = tz;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = GLKMatrix4Identity;
|
||||||
|
m.m[0] = sx;
|
||||||
|
m.m[5] = sy;
|
||||||
|
m.m[10] = sz;
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z)
|
||||||
|
{
|
||||||
|
GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z));
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float cosp = 1.0f - cos;
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0],
|
||||||
|
cosp * v.v[0] * v.v[1] + v.v[2] * sin,
|
||||||
|
cosp * v.v[0] * v.v[2] - v.v[1] * sin,
|
||||||
|
0.0f,
|
||||||
|
cosp * v.v[0] * v.v[1] - v.v[2] * sin,
|
||||||
|
cos + cosp * v.v[1] * v.v[1],
|
||||||
|
cosp * v.v[1] * v.v[2] + v.v[0] * sin,
|
||||||
|
0.0f,
|
||||||
|
cosp * v.v[0] * v.v[2] + v.v[1] * sin,
|
||||||
|
cosp * v.v[1] * v.v[2] - v.v[0] * sin,
|
||||||
|
cos + cosp * v.v[2] * v.v[2],
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
0.0f,
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, cos, sin, 0.0f,
|
||||||
|
0.0f, -sin, cos, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f,
|
||||||
|
0.0f, 1.0f, 0.0f, 0.0f,
|
||||||
|
sin, 0.0f, cos, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians)
|
||||||
|
{
|
||||||
|
float cos = cosf(radians);
|
||||||
|
float sin = sinf(radians);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cos, sin, 0.0f, 0.0f,
|
||||||
|
-sin, cos, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 1.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, 0.0f, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float cotan = 1.0f / tanf(fovyRadians / 2.0f);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, cotan, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f,
|
||||||
|
0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float ral = right + left;
|
||||||
|
float rsl = right - left;
|
||||||
|
float tsb = top - bottom;
|
||||||
|
float tab = top + bottom;
|
||||||
|
float fan = farZ + nearZ;
|
||||||
|
float fsn = farZ - nearZ;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f,
|
||||||
|
ral / rsl, tab / tsb, -fan / fsn, -1.0f,
|
||||||
|
0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right,
|
||||||
|
float bottom, float top,
|
||||||
|
float nearZ, float farZ)
|
||||||
|
{
|
||||||
|
float ral = right + left;
|
||||||
|
float rsl = right - left;
|
||||||
|
float tab = top + bottom;
|
||||||
|
float tsb = top - bottom;
|
||||||
|
float fan = farZ + nearZ;
|
||||||
|
float fsn = farZ - nearZ;
|
||||||
|
|
||||||
|
GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f,
|
||||||
|
0.0f, 2.0f / tsb, 0.0f, 0.0f,
|
||||||
|
0.0f, 0.0f, -2.0f / fsn, 0.0f,
|
||||||
|
-ral / rsl, -tab / tsb, -fan / fsn, 1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ,
|
||||||
|
float centerX, float centerY, float centerZ,
|
||||||
|
float upX, float upY, float upZ)
|
||||||
|
{
|
||||||
|
GLKVector3 ev = { eyeX, eyeY, eyeZ };
|
||||||
|
GLKVector3 cv = { centerX, centerY, centerZ };
|
||||||
|
GLKVector3 uv = { upX, upY, upZ };
|
||||||
|
GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv)));
|
||||||
|
GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n));
|
||||||
|
GLKVector3 v = GLKVector3CrossProduct(n, u);
|
||||||
|
|
||||||
|
GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f,
|
||||||
|
u.v[1], v.v[1], n.v[1], 0.0f,
|
||||||
|
u.v[2], v.v[2], n.v[2], 0.0f,
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(u), ev),
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(v), ev),
|
||||||
|
GLKVector3DotProduct(GLKVector3Negate(n), ev),
|
||||||
|
1.0f };
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
GLKMatrix2 m = { matrix.m[0], matrix.m[1],
|
||||||
|
matrix.m[4], matrix.m[5] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row)
|
||||||
|
{
|
||||||
|
GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] };
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4_t v = vld1q_f32(&(matrix.m[column * 4]));
|
||||||
|
return *(GLKVector4 *)&v;
|
||||||
|
#else
|
||||||
|
GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] };
|
||||||
|
return v;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector)
|
||||||
|
{
|
||||||
|
matrix.m[row] = vector.v[0];
|
||||||
|
matrix.m[row + 4] = vector.v[1];
|
||||||
|
matrix.m[row + 8] = vector.v[2];
|
||||||
|
matrix.m[row + 12] = vector.v[3];
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float *dst = &(matrix.m[column * 4]);
|
||||||
|
vst1q_f32(dst, vld1q_f32(vector.v));
|
||||||
|
return matrix;
|
||||||
|
#else
|
||||||
|
matrix.m[column * 4 + 0] = vector.v[0];
|
||||||
|
matrix.m[column * 4 + 1] = vector.v[1];
|
||||||
|
matrix.m[column * 4 + 2] = vector.v[2];
|
||||||
|
matrix.m[column * 4 + 3] = vector.v[3];
|
||||||
|
|
||||||
|
return matrix;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t m = vld4q_f32(matrix.m);
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12],
|
||||||
|
matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13],
|
||||||
|
matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14],
|
||||||
|
matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0));
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0));
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0));
|
||||||
|
m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2));
|
||||||
|
|
||||||
|
m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3));
|
||||||
|
m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3));
|
||||||
|
m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3));
|
||||||
|
m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3));
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] * matrixRight.m[0] + matrixLeft.m[4] * matrixRight.m[1] + matrixLeft.m[8] * matrixRight.m[2] + matrixLeft.m[12] * matrixRight.m[3];
|
||||||
|
m.m[4] = matrixLeft.m[0] * matrixRight.m[4] + matrixLeft.m[4] * matrixRight.m[5] + matrixLeft.m[8] * matrixRight.m[6] + matrixLeft.m[12] * matrixRight.m[7];
|
||||||
|
m.m[8] = matrixLeft.m[0] * matrixRight.m[8] + matrixLeft.m[4] * matrixRight.m[9] + matrixLeft.m[8] * matrixRight.m[10] + matrixLeft.m[12] * matrixRight.m[11];
|
||||||
|
m.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14] + matrixLeft.m[12] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[1] = matrixLeft.m[1] * matrixRight.m[0] + matrixLeft.m[5] * matrixRight.m[1] + matrixLeft.m[9] * matrixRight.m[2] + matrixLeft.m[13] * matrixRight.m[3];
|
||||||
|
m.m[5] = matrixLeft.m[1] * matrixRight.m[4] + matrixLeft.m[5] * matrixRight.m[5] + matrixLeft.m[9] * matrixRight.m[6] + matrixLeft.m[13] * matrixRight.m[7];
|
||||||
|
m.m[9] = matrixLeft.m[1] * matrixRight.m[8] + matrixLeft.m[5] * matrixRight.m[9] + matrixLeft.m[9] * matrixRight.m[10] + matrixLeft.m[13] * matrixRight.m[11];
|
||||||
|
m.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14] + matrixLeft.m[13] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[2] = matrixLeft.m[2] * matrixRight.m[0] + matrixLeft.m[6] * matrixRight.m[1] + matrixLeft.m[10] * matrixRight.m[2] + matrixLeft.m[14] * matrixRight.m[3];
|
||||||
|
m.m[6] = matrixLeft.m[2] * matrixRight.m[4] + matrixLeft.m[6] * matrixRight.m[5] + matrixLeft.m[10] * matrixRight.m[6] + matrixLeft.m[14] * matrixRight.m[7];
|
||||||
|
m.m[10] = matrixLeft.m[2] * matrixRight.m[8] + matrixLeft.m[6] * matrixRight.m[9] + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11];
|
||||||
|
m.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15];
|
||||||
|
|
||||||
|
m.m[3] = matrixLeft.m[3] * matrixRight.m[0] + matrixLeft.m[7] * matrixRight.m[1] + matrixLeft.m[11] * matrixRight.m[2] + matrixLeft.m[15] * matrixRight.m[3];
|
||||||
|
m.m[7] = matrixLeft.m[3] * matrixRight.m[4] + matrixLeft.m[7] * matrixRight.m[5] + matrixLeft.m[11] * matrixRight.m[6] + matrixLeft.m[15] * matrixRight.m[7];
|
||||||
|
m.m[11] = matrixLeft.m[3] * matrixRight.m[8] + matrixLeft.m[7] * matrixRight.m[9] + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11];
|
||||||
|
m.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);
|
||||||
|
m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);
|
||||||
|
m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);
|
||||||
|
m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] + matrixRight.m[0];
|
||||||
|
m.m[1] = matrixLeft.m[1] + matrixRight.m[1];
|
||||||
|
m.m[2] = matrixLeft.m[2] + matrixRight.m[2];
|
||||||
|
m.m[3] = matrixLeft.m[3] + matrixRight.m[3];
|
||||||
|
|
||||||
|
m.m[4] = matrixLeft.m[4] + matrixRight.m[4];
|
||||||
|
m.m[5] = matrixLeft.m[5] + matrixRight.m[5];
|
||||||
|
m.m[6] = matrixLeft.m[6] + matrixRight.m[6];
|
||||||
|
m.m[7] = matrixLeft.m[7] + matrixRight.m[7];
|
||||||
|
|
||||||
|
m.m[8] = matrixLeft.m[8] + matrixRight.m[8];
|
||||||
|
m.m[9] = matrixLeft.m[9] + matrixRight.m[9];
|
||||||
|
m.m[10] = matrixLeft.m[10] + matrixRight.m[10];
|
||||||
|
m.m[11] = matrixLeft.m[11] + matrixRight.m[11];
|
||||||
|
|
||||||
|
m.m[12] = matrixLeft.m[12] + matrixRight.m[12];
|
||||||
|
m.m[13] = matrixLeft.m[13] + matrixRight.m[13];
|
||||||
|
m.m[14] = matrixLeft.m[14] + matrixRight.m[14];
|
||||||
|
m.m[15] = matrixLeft.m[15] + matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]);
|
||||||
|
m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]);
|
||||||
|
m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]);
|
||||||
|
m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]);
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m;
|
||||||
|
|
||||||
|
m.m[0] = matrixLeft.m[0] - matrixRight.m[0];
|
||||||
|
m.m[1] = matrixLeft.m[1] - matrixRight.m[1];
|
||||||
|
m.m[2] = matrixLeft.m[2] - matrixRight.m[2];
|
||||||
|
m.m[3] = matrixLeft.m[3] - matrixRight.m[3];
|
||||||
|
|
||||||
|
m.m[4] = matrixLeft.m[4] - matrixRight.m[4];
|
||||||
|
m.m[5] = matrixLeft.m[5] - matrixRight.m[5];
|
||||||
|
m.m[6] = matrixLeft.m[6] - matrixRight.m[6];
|
||||||
|
m.m[7] = matrixLeft.m[7] - matrixRight.m[7];
|
||||||
|
|
||||||
|
m.m[8] = matrixLeft.m[8] - matrixRight.m[8];
|
||||||
|
m.m[9] = matrixLeft.m[9] - matrixRight.m[9];
|
||||||
|
m.m[10] = matrixLeft.m[10] - matrixRight.m[10];
|
||||||
|
m.m[11] = matrixLeft.m[11] - matrixRight.m[11];
|
||||||
|
|
||||||
|
m.m[12] = matrixLeft.m[12] - matrixRight.m[12];
|
||||||
|
m.m[13] = matrixLeft.m[13] - matrixRight.m[13];
|
||||||
|
m.m[14] = matrixLeft.m[14] - matrixRight.m[14];
|
||||||
|
m.m[15] = matrixLeft.m[15] - matrixRight.m[15];
|
||||||
|
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12],
|
||||||
|
matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13],
|
||||||
|
matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],
|
||||||
|
matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],
|
||||||
|
matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3],
|
||||||
|
matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7],
|
||||||
|
matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11],
|
||||||
|
matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12],
|
||||||
|
matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13],
|
||||||
|
matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14],
|
||||||
|
matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx,
|
||||||
|
matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy,
|
||||||
|
matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz,
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],
|
||||||
|
matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],
|
||||||
|
matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix;
|
||||||
|
float32x4x4_t m;
|
||||||
|
|
||||||
|
m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]);
|
||||||
|
m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]);
|
||||||
|
m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]);
|
||||||
|
m.val[3] = iMatrix.val[3];
|
||||||
|
|
||||||
|
return *(GLKMatrix4 *)&m;
|
||||||
|
#else
|
||||||
|
GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0],
|
||||||
|
matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1],
|
||||||
|
matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2],
|
||||||
|
matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] };
|
||||||
|
return m;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians)
|
||||||
|
{
|
||||||
|
GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians);
|
||||||
|
return GLKMatrix4Multiply(matrix, rm);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f));
|
||||||
|
return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));
|
||||||
|
return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight)
|
||||||
|
{
|
||||||
|
GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f));
|
||||||
|
return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight)
|
||||||
|
{
|
||||||
|
#if defined(__ARM_NEON__)
|
||||||
|
float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft;
|
||||||
|
float32x4_t v;
|
||||||
|
|
||||||
|
iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]);
|
||||||
|
iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]);
|
||||||
|
iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]);
|
||||||
|
iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]);
|
||||||
|
|
||||||
|
iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]);
|
||||||
|
iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]);
|
||||||
|
|
||||||
|
v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]);
|
||||||
|
|
||||||
|
return *(GLKVector4 *)&v;
|
||||||
|
#else
|
||||||
|
GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3],
|
||||||
|
matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] };
|
||||||
|
return v;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount)
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i=0; i < vectorCount; i++)
|
||||||
|
vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* __GLK_MATRIX_4_H */
|
||||||
99
samples/C/NWMan.h
Normal file
99
samples/C/NWMan.h
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
#ifndef _NME_WMAN_H
|
||||||
|
#define _NME_WMAN_H
|
||||||
|
|
||||||
|
// Internal window manager API
|
||||||
|
|
||||||
|
#include "NCompat.h"
|
||||||
|
|
||||||
|
START_HEAD
|
||||||
|
|
||||||
|
#include "NPos.h"
|
||||||
|
#include "NUtil.h"
|
||||||
|
#include "NTypes.h"
|
||||||
|
|
||||||
|
NTS(NWMan_event);
|
||||||
|
|
||||||
|
NSTRUCT(NWMan, {
|
||||||
|
// Init stuff
|
||||||
|
bool (*init)();
|
||||||
|
bool (*destroy)();
|
||||||
|
|
||||||
|
// Window stuff
|
||||||
|
bool (*create_window)();
|
||||||
|
bool (*destroy_window)();
|
||||||
|
|
||||||
|
void (*swap_buffers)();
|
||||||
|
|
||||||
|
// Event stuff
|
||||||
|
bool (*next_event)(NWMan_event* event);
|
||||||
|
|
||||||
|
// Time stuff
|
||||||
|
uint (*get_millis)();
|
||||||
|
void (*sleep)(uint millis);
|
||||||
|
|
||||||
|
// Info
|
||||||
|
int rshift_key;
|
||||||
|
int lshift_key;
|
||||||
|
int left_key;
|
||||||
|
int right_key;
|
||||||
|
});
|
||||||
|
|
||||||
|
NENUM(NWMan_event_type, {
|
||||||
|
N_WMAN_MOUSE_MOVE = 0,
|
||||||
|
N_WMAN_MOUSE_BUTTON = 1,
|
||||||
|
N_WMAN_MOUSE_WHEEL = 2,
|
||||||
|
|
||||||
|
N_WMAN_KEYBOARD = 10,
|
||||||
|
|
||||||
|
N_WMAN_QUIT = 20,
|
||||||
|
N_WMAN_RESIZE = 21,
|
||||||
|
N_WMAN_FOCUS = 22
|
||||||
|
});
|
||||||
|
|
||||||
|
#define N_WMAN_MOUSE_LEFT 0
|
||||||
|
#define N_WMAN_MOUSE_RIGHT 1
|
||||||
|
#define N_WMAN_MOUSE_MIDDLE 2
|
||||||
|
|
||||||
|
NSTRUCT(NWMan_event, {
|
||||||
|
NWMan_event_type type;
|
||||||
|
|
||||||
|
union {
|
||||||
|
// Mouse
|
||||||
|
|
||||||
|
NPos2i mouse_pos;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
short id;
|
||||||
|
bool state;
|
||||||
|
} mouse_button;
|
||||||
|
|
||||||
|
signed char mouse_wheel; // 1 if up, -1 if down
|
||||||
|
|
||||||
|
// Keyboard
|
||||||
|
|
||||||
|
struct {
|
||||||
|
int key;
|
||||||
|
bool state;
|
||||||
|
} keyboard;
|
||||||
|
|
||||||
|
// Window
|
||||||
|
|
||||||
|
bool window_quit; // Will always be true if WM_QUIT
|
||||||
|
|
||||||
|
NPos2i window_size;
|
||||||
|
|
||||||
|
bool window_focus;
|
||||||
|
};
|
||||||
|
});
|
||||||
|
|
||||||
|
NWMan_event NWMan_event_new(NWMan_event_type type);
|
||||||
|
|
||||||
|
|
||||||
|
bool NWMan_init();
|
||||||
|
bool NWMan_destroy();
|
||||||
|
|
||||||
|
extern NWMan N_WMan;
|
||||||
|
|
||||||
|
END_HEAD
|
||||||
|
|
||||||
|
#endif
|
||||||
27
samples/C/Nightmare.h
Normal file
27
samples/C/Nightmare.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
#ifndef _NMEX_NIGHTMARE_H
|
||||||
|
#define _NMEX_NIGHTMARE_H
|
||||||
|
|
||||||
|
//#define NMEX
|
||||||
|
|
||||||
|
#include "../src/NCompat.h"
|
||||||
|
|
||||||
|
START_HEAD
|
||||||
|
|
||||||
|
#include "../src/NTypes.h"
|
||||||
|
#include "../src/NUtil.h"
|
||||||
|
#include "../src/NPorting.h"
|
||||||
|
#include "../src/NGlobals.h"
|
||||||
|
#include "../src/NLog.h"
|
||||||
|
#include "../src/NWMan.h"
|
||||||
|
#include "../src/NRsc.h"
|
||||||
|
#include "../src/NShader.h"
|
||||||
|
#include "../src/NSquare.h"
|
||||||
|
#include "../src/NImage.h"
|
||||||
|
#include "../src/NSprite.h"
|
||||||
|
#include "../src/NSpritesheet.h"
|
||||||
|
#include "../src/NEntity.h"
|
||||||
|
#include "../src/Game.h"
|
||||||
|
|
||||||
|
END_HEAD
|
||||||
|
|
||||||
|
#endif
|
||||||
89
samples/C/ntru_encrypt.h
Normal file
89
samples/C/ntru_encrypt.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2014 FH Bielefeld
|
||||||
|
*
|
||||||
|
* This file is part of a FH Bielefeld project.
|
||||||
|
*
|
||||||
|
* This library is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
|
* License as published by the Free Software Foundation; either
|
||||||
|
* version 2.1 of the License, or (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This library is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* Lesser General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
|
* License along with this library; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
||||||
|
* MA 02110-1301 USA
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file ntru_encrypt.h
|
||||||
|
* Header for the internal API of ntru_encrypt.c.
|
||||||
|
* @brief header for encrypt.c
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef PQC_ENCRYPT_H
|
||||||
|
#define PQC_ENCRYPT_H
|
||||||
|
|
||||||
|
|
||||||
|
#include "ntru_params.h"
|
||||||
|
#include "ntru_poly.h"
|
||||||
|
#include "ntru_string.h"
|
||||||
|
|
||||||
|
#include <fmpz_poly.h>
|
||||||
|
#include <fmpz.h>
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* encrypt the msg, using the math:
|
||||||
|
* e = (h ∗ r) + m (mod q)
|
||||||
|
*
|
||||||
|
* e = the encrypted poly
|
||||||
|
*
|
||||||
|
* h = the public key
|
||||||
|
*
|
||||||
|
* r = the random poly
|
||||||
|
*
|
||||||
|
* m = the message poly
|
||||||
|
*
|
||||||
|
* q = large mod
|
||||||
|
*
|
||||||
|
* @param msg_tern the message to encrypt, in ternary format
|
||||||
|
* @param pub_key the public key
|
||||||
|
* @param rnd the random poly (should have relatively small
|
||||||
|
* coefficients, but not restricted to {-1, 0, 1})
|
||||||
|
* @param out the output poly which is in the range {0, q-1}
|
||||||
|
* (not ternary!) [out]
|
||||||
|
* @param params ntru_params the ntru context
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
ntru_encrypt_poly(
|
||||||
|
const fmpz_poly_t msg_tern,
|
||||||
|
const fmpz_poly_t pub_key,
|
||||||
|
const fmpz_poly_t rnd,
|
||||||
|
fmpz_poly_t out,
|
||||||
|
const ntru_params *params);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Encrypt a message in the form of a null-terminated char array and
|
||||||
|
* return a string.
|
||||||
|
*
|
||||||
|
* @param msg the message
|
||||||
|
* @param pub_key the public key
|
||||||
|
* @param rnd the random poly (should have relatively small
|
||||||
|
* coefficients, but not restricted to {-1, 0, 1})
|
||||||
|
* @param params ntru_params the ntru context
|
||||||
|
* @return the newly allocated encrypted string
|
||||||
|
*/
|
||||||
|
string *
|
||||||
|
ntru_encrypt_string(
|
||||||
|
const string *msg,
|
||||||
|
const fmpz_poly_t pub_key,
|
||||||
|
const fmpz_poly_t rnd,
|
||||||
|
const ntru_params *params);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* PQC_ENCRYPT_H */
|
||||||
@@ -20,6 +20,22 @@ class TestHeuristcs < Test::Unit::TestCase
|
|||||||
Dir.glob("#{samples_path}/#{language_name}/#{file}")
|
Dir.glob("#{samples_path}/#{language_name}/#{file}")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Candidate languages = ["C++", "Objective-C"]
|
||||||
|
def test_obj_c_by_heuristics
|
||||||
|
# Only calling out '.h' filenames as these are the ones causing issues
|
||||||
|
assert_heuristics({
|
||||||
|
"Objective-C" => all_fixtures("Objective-C", "*.h"),
|
||||||
|
"C++" => ["C++/render_adapter.cpp", "C++/ThreadedQueue.h"],
|
||||||
|
"C" => nil
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_c_by_heuristics
|
||||||
|
languages = [Language["C++"], Language["Objective-C"], Language["C"]]
|
||||||
|
results = Heuristics.call(file_blob("C/ArrowLeft.h"), languages)
|
||||||
|
assert_equal [], results
|
||||||
|
end
|
||||||
|
|
||||||
def test_detect_still_works_if_nothing_matches
|
def test_detect_still_works_if_nothing_matches
|
||||||
blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m"))
|
blob = Linguist::FileBlob.new(File.join(samples_path, "Objective-C/hello.m"))
|
||||||
match = Language.detect(blob)
|
match = Language.detect(blob)
|
||||||
|
|||||||
BIN
vendor/cache/yajl-ruby-1.1.0.gem
vendored
Normal file
BIN
vendor/cache/yajl-ruby-1.1.0.gem
vendored
Normal file
Binary file not shown.
BIN
vendor/cache/yajl-ruby-1.2.1.gem
vendored
BIN
vendor/cache/yajl-ruby-1.2.1.gem
vendored
Binary file not shown.
Reference in New Issue
Block a user