Compare commits
2 Commits
master
...
wow-commit
Author | SHA1 | Date |
---|---|---|
|
6dfc0cc5dd | |
|
86dfa2637d |
4
Makefile
4
Makefile
|
@ -14,8 +14,8 @@ SRCS += worker.c
|
||||||
|
|
||||||
OBJS := $(SRCS:.c=.o)
|
OBJS := $(SRCS:.c=.o)
|
||||||
|
|
||||||
CFLAGS += `pkg-config libglfw ftgl openal --cflags` -g
|
CFLAGS += `pkg-config freetype2 glfw3 ftgl openal opengl --cflags` -g
|
||||||
LDFLAGS += `pkg-config libglfw ftgl openal --libs` -g
|
LDFLAGS += -lm -lpthread -lSOIL `pkg-config freetype2 glfw3 ftgl openal opengl --libs`
|
||||||
|
|
||||||
lfsdash: $(OBJS)
|
lfsdash: $(OBJS)
|
||||||
$(CC) $(LDFLAGS) $(OBJS) -o $@
|
$(CC) $(LDFLAGS) $(OBJS) -o $@
|
||||||
|
|
6
audio.c
6
audio.c
|
@ -58,7 +58,8 @@ void *file_allocate_and_read_bytes(FILE *file, size_t bytes)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline ALenum GetFormatFromInfo(short channels, short bitsPerSample) {
|
static inline ALenum GetFormatFromInfo(short channels, short bitsPerSample)
|
||||||
|
{
|
||||||
if (channels == 1)
|
if (channels == 1)
|
||||||
return AL_FORMAT_MONO16;
|
return AL_FORMAT_MONO16;
|
||||||
return AL_FORMAT_STEREO16;
|
return AL_FORMAT_STEREO16;
|
||||||
|
@ -130,7 +131,8 @@ void audio_init(void)
|
||||||
// Generate buffers, or else no sound will happen!
|
// Generate buffers, or else no sound will happen!
|
||||||
alGenBuffers(NUM_BUFFERS, buffer);
|
alGenBuffers(NUM_BUFFERS, buffer);
|
||||||
|
|
||||||
if (alGetError() != AL_NO_ERROR) {
|
if (alGetError() != AL_NO_ERROR)
|
||||||
|
{
|
||||||
printf("- Error creating buffers !!\n");
|
printf("- Error creating buffers !!\n");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
3
audio.h
3
audio.h
|
@ -1,7 +1,8 @@
|
||||||
#ifndef AUDIO_H
|
#ifndef AUDIO_H
|
||||||
#define AUDIO_H
|
#define AUDIO_H
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
FX_ON,
|
FX_ON,
|
||||||
FX_OFF,
|
FX_OFF,
|
||||||
FX_BING,
|
FX_BING,
|
||||||
|
|
15
cars.c
15
cars.c
|
@ -36,15 +36,18 @@ void init_cars(void)
|
||||||
memset(s_cars, 0, sizeof s_cars);
|
memset(s_cars, 0, sizeof s_cars);
|
||||||
|
|
||||||
FILE *f = fopen("cars.txt", "r");
|
FILE *f = fopen("cars.txt", "r");
|
||||||
if (!f) return;
|
if (!f)
|
||||||
|
return;
|
||||||
|
|
||||||
struct car *car = s_cars;
|
struct car *car = s_cars;
|
||||||
|
|
||||||
while (!feof(f))
|
while (!feof(f))
|
||||||
{
|
{
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
if (fgets(buf, sizeof buf, f) <= 0) break;
|
if (fgets(buf, sizeof buf, f) <= 0)
|
||||||
if (*buf == '#') continue;
|
break;
|
||||||
|
if (*buf == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
char *bufp = buf, *p;
|
char *bufp = buf, *p;
|
||||||
p = strsep(&bufp, ",");
|
p = strsep(&bufp, ",");
|
||||||
|
@ -70,7 +73,8 @@ void init_cars(void)
|
||||||
|
|
||||||
car++;
|
car++;
|
||||||
|
|
||||||
if (car - s_cars == MAX_CARS) break;
|
if (car - s_cars == MAX_CARS)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
fclose(f);
|
fclose(f);
|
||||||
|
@ -83,7 +87,8 @@ int get_car(const char tag[4], struct car *car)
|
||||||
{
|
{
|
||||||
if (!strcmp(s_cars[i].tag, tag))
|
if (!strcmp(s_cars[i].tag, tag))
|
||||||
{
|
{
|
||||||
if (car != NULL) memcpy(car, &s_cars[i], sizeof *car);
|
if (car != NULL)
|
||||||
|
memcpy(car, &s_cars[i], sizeof *car);
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
33
config.c
33
config.c
|
@ -57,7 +57,8 @@ void config_set_string(const char *key, const char *value)
|
||||||
itemp = &(*itemp)->next;
|
itemp = &(*itemp)->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value == NULL) return;
|
if (value == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
*itemp = malloc(sizeof *item);
|
*itemp = malloc(sizeof *item);
|
||||||
item = *itemp;
|
item = *itemp;
|
||||||
|
@ -70,24 +71,29 @@ void config_set_string(const char *key, const char *value)
|
||||||
static void config_rehash(void)
|
static void config_rehash(void)
|
||||||
{
|
{
|
||||||
FILE *f = fopen(s_config.filename, "r");
|
FILE *f = fopen(s_config.filename, "r");
|
||||||
if (f == NULL) return;
|
if (f == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
config_free();
|
config_free();
|
||||||
|
|
||||||
while (!feof(f))
|
while (!feof(f))
|
||||||
{
|
{
|
||||||
char buf[256];
|
char buf[256];
|
||||||
if (fgets(buf, sizeof buf, f) <= 0) break;
|
if (fgets(buf, sizeof buf, f) <= 0)
|
||||||
|
break;
|
||||||
|
|
||||||
/* Ignore comments */
|
/* Ignore comments */
|
||||||
if (*buf == '#') continue;
|
if (*buf == '#')
|
||||||
|
continue;
|
||||||
|
|
||||||
char *n = strchr(buf, '=');
|
char *n = strchr(buf, '=');
|
||||||
if (n == NULL) continue;
|
if (n == NULL)
|
||||||
|
continue;
|
||||||
*n++ = '\0';
|
*n++ = '\0';
|
||||||
|
|
||||||
char *eol = strchr(n, '\n');
|
char *eol = strchr(n, '\n');
|
||||||
if (eol != NULL) *eol = '\0';
|
if (eol != NULL)
|
||||||
|
*eol = '\0';
|
||||||
|
|
||||||
config_set_string(buf, n);
|
config_set_string(buf, n);
|
||||||
}
|
}
|
||||||
|
@ -98,7 +104,8 @@ static void config_rehash(void)
|
||||||
static void config_write(void)
|
static void config_write(void)
|
||||||
{
|
{
|
||||||
FILE *f = fopen(s_config.filename, "w");
|
FILE *f = fopen(s_config.filename, "w");
|
||||||
if (f == NULL) return;
|
if (f == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
struct configitem *curr;
|
struct configitem *curr;
|
||||||
for (curr = s_config.head; curr != NULL; curr = curr->next)
|
for (curr = s_config.head; curr != NULL; curr = curr->next)
|
||||||
|
@ -158,10 +165,12 @@ int config_get_int(const char *setting, int *value)
|
||||||
char *c, *endptr;
|
char *c, *endptr;
|
||||||
int v;
|
int v;
|
||||||
|
|
||||||
if (!config_get_string(setting, &c)) return 0;
|
if (!config_get_string(setting, &c))
|
||||||
|
return 0;
|
||||||
|
|
||||||
v = strtol(c, &endptr, 10);
|
v = strtol(c, &endptr, 10);
|
||||||
if (*endptr != '\0') return 0;
|
if (*endptr != '\0')
|
||||||
|
return 0;
|
||||||
|
|
||||||
*value = v;
|
*value = v;
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -172,10 +181,12 @@ int config_get_float(const char *setting, float *value)
|
||||||
char *c, *endptr;
|
char *c, *endptr;
|
||||||
float v;
|
float v;
|
||||||
|
|
||||||
if (!config_get_string(setting, &c)) return 0;
|
if (!config_get_string(setting, &c))
|
||||||
|
return 0;
|
||||||
|
|
||||||
v = strtof(c, &endptr);
|
v = strtof(c, &endptr);
|
||||||
if (*endptr != '\0') return 0;
|
if (*endptr != '\0')
|
||||||
|
return 0;
|
||||||
|
|
||||||
*value = v;
|
*value = v;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
49
gauge.c
49
gauge.c
|
@ -1,4 +1,4 @@
|
||||||
#include <GL/glfw.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <FTGL/ftgl.h>
|
#include <FTGL/ftgl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
@ -23,7 +23,6 @@ void DrawArc(float inner, float outer, float start_angle, float arc_angle, int n
|
||||||
float xo = outer * sinf(start_angle); // we now start at the start angle
|
float xo = outer * sinf(start_angle); // we now start at the start angle
|
||||||
float yo = outer * cosf(start_angle);
|
float yo = outer * cosf(start_angle);
|
||||||
|
|
||||||
|
|
||||||
glBegin(GL_TRIANGLE_STRIP); // since the arc is not a closed curve, this is a strip now
|
glBegin(GL_TRIANGLE_STRIP); // since the arc is not a closed curve, this is a strip now
|
||||||
int ii;
|
int ii;
|
||||||
for (ii = 0; ii < num_segments; ii++)
|
for (ii = 0; ii < num_segments; ii++)
|
||||||
|
@ -81,8 +80,6 @@ void drawDial(const struct gauge *gauge, float value, int style)
|
||||||
float angle = gauge->anglemax - gauge->anglemin;
|
float angle = gauge->anglemax - gauge->anglemin;
|
||||||
float cura = (value - gauge->rangemin) / range * angle + gauge->anglemin;
|
float cura = (value - gauge->rangemin) / range * angle + gauge->anglemin;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
switch (style)
|
switch (style)
|
||||||
{
|
{
|
||||||
case GT_NONE:
|
case GT_NONE:
|
||||||
|
@ -126,7 +123,6 @@ void drawDial(const struct gauge *gauge, float value, int style)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *font, int gaugetype)
|
void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *font, int gaugetype)
|
||||||
{
|
{
|
||||||
float range = gauge->rangemax - gauge->rangemin;
|
float range = gauge->rangemax - gauge->rangemin;
|
||||||
|
@ -140,24 +136,31 @@ void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *fon
|
||||||
float majorstep = gauge->majorstep;
|
float majorstep = gauge->majorstep;
|
||||||
float minorstep = gauge->minorstep;
|
float minorstep = gauge->minorstep;
|
||||||
|
|
||||||
while (1) {
|
while (1)
|
||||||
|
{
|
||||||
major = angle / (range / majorstep + 0.0);
|
major = angle / (range / majorstep + 0.0);
|
||||||
minor = angle / (range / minorstep + 0.0);
|
minor = angle / (range / minorstep + 0.0);
|
||||||
if (fabsf(major) < 12 * M_PI / 180.0) {
|
if (fabsf(major) < 12 * M_PI / 180.0)
|
||||||
|
{
|
||||||
majorstep *= 2;
|
majorstep *= 2;
|
||||||
minorstep = majorstep / 2;
|
minorstep = majorstep / 2;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (value < gauge->rangemin) value = gauge->rangemin;
|
if (value < gauge->rangemin)
|
||||||
if (value > gauge->rangemax * 2) value = gauge->rangemax * 2;
|
value = gauge->rangemin;
|
||||||
|
if (value > gauge->rangemax * 2)
|
||||||
|
value = gauge->rangemax * 2;
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glScalef(gauge->radius, gauge->radius, 1.0);
|
glScalef(gauge->radius, gauge->radius, 1.0);
|
||||||
|
|
||||||
if (red > 0) {
|
if (red > 0)
|
||||||
|
{
|
||||||
glLineWidth(1.0);
|
glLineWidth(1.0);
|
||||||
glColor4f(0.8, 0.0, 0.0, 1.0);
|
glColor4f(0.8, 0.0, 0.0, 1.0);
|
||||||
|
|
||||||
|
@ -182,7 +185,8 @@ void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *fon
|
||||||
// for (cura = gauge->anglemin; cura < gauge->anglemax; cura += minor)
|
// for (cura = gauge->anglemin; cura < gauge->anglemax; cura += minor)
|
||||||
for (ii = 0; ii <= range / minorstep; ii++)
|
for (ii = 0; ii <= range / minorstep; ii++)
|
||||||
{
|
{
|
||||||
if (red > 0 && ii * minorstep >= red) {
|
if (red > 0 && ii * minorstep >= red)
|
||||||
|
{
|
||||||
glColor4f(1.0, 1.0, 1.0, 1.0);
|
glColor4f(1.0, 1.0, 1.0, 1.0);
|
||||||
}
|
}
|
||||||
float cura = gauge->anglemin + ii * minor;
|
float cura = gauge->anglemin + ii * minor;
|
||||||
|
@ -201,7 +205,8 @@ void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *fon
|
||||||
// for (cura = gauge->anglemin; cura < gauge->anglemax; cura += major)
|
// for (cura = gauge->anglemin; cura < gauge->anglemax; cura += major)
|
||||||
for (ii = 0; ii <= range / majorstep; ii++)
|
for (ii = 0; ii <= range / majorstep; ii++)
|
||||||
{
|
{
|
||||||
if (red > 0 && ii * majorstep > red) {
|
if (red > 0 && ii * majorstep > red)
|
||||||
|
{
|
||||||
glColor4f(1.0, 1.0, 1.0, 1.0);
|
glColor4f(1.0, 1.0, 1.0, 1.0);
|
||||||
}
|
}
|
||||||
float cura = gauge->anglemin + ii * major;
|
float cura = gauge->anglemin + ii * major;
|
||||||
|
@ -215,12 +220,19 @@ void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *fon
|
||||||
glEnd();
|
glEnd();
|
||||||
|
|
||||||
char text[10];
|
char text[10];
|
||||||
if (gauge->majorstep > 100) {
|
if (gauge->majorstep > 100)
|
||||||
|
{
|
||||||
snprintf(text, sizeof text, "%d", (int)(ii * majorstep / 1000 + gauge->rangemin));
|
snprintf(text, sizeof text, "%d", (int)(ii * majorstep / 1000 + gauge->rangemin));
|
||||||
} else {
|
}
|
||||||
if (range == 1) {
|
else
|
||||||
snprintf(text, sizeof text, ii == 0 ? "E" : ii == 1 ? "½" : "F");
|
{
|
||||||
} else {
|
if (range == 1)
|
||||||
|
{
|
||||||
|
snprintf(text, sizeof text, ii == 0 ? "E" : ii == 1 ? "½"
|
||||||
|
: "F");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
snprintf(text, sizeof text, "%d", (int)(ii * majorstep + gauge->rangemin));
|
snprintf(text, sizeof text, "%d", (int)(ii * majorstep + gauge->rangemin));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -234,4 +246,3 @@ void draw_gauge(const struct gauge *gauge, float value, float red, FTGLfont *fon
|
||||||
|
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
3
gauge.h
3
gauge.h
|
@ -58,7 +58,8 @@ struct gauge
|
||||||
struct colour dial;
|
struct colour dial;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
GT_NONE,
|
GT_NONE,
|
||||||
GT_NEEDLE,
|
GT_NEEDLE,
|
||||||
GT_LINE,
|
GT_LINE,
|
||||||
|
|
17
gettime.h
17
gettime.h
|
@ -40,21 +40,28 @@ static inline int clock_gettime(int X, struct timespec *ts)
|
||||||
static int initialized = 0;
|
static int initialized = 0;
|
||||||
static BOOL usePerformanceCounter = 0;
|
static BOOL usePerformanceCounter = 0;
|
||||||
|
|
||||||
if (!initialized) {
|
if (!initialized)
|
||||||
|
{
|
||||||
LARGE_INTEGER performanceFrequency;
|
LARGE_INTEGER performanceFrequency;
|
||||||
initialized = 1;
|
initialized = 1;
|
||||||
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
|
usePerformanceCounter = QueryPerformanceFrequency(&performanceFrequency);
|
||||||
if (usePerformanceCounter) {
|
if (usePerformanceCounter)
|
||||||
|
{
|
||||||
QueryPerformanceCounter(&offset);
|
QueryPerformanceCounter(&offset);
|
||||||
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
|
frequencyToMicroseconds = (double)performanceFrequency.QuadPart / 1000000.;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
offset = getFILETIMEoffset();
|
offset = getFILETIMEoffset();
|
||||||
frequencyToMicroseconds = 10.;
|
frequencyToMicroseconds = 10.;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (usePerformanceCounter) {
|
if (usePerformanceCounter)
|
||||||
|
{
|
||||||
QueryPerformanceCounter(&t);
|
QueryPerformanceCounter(&t);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
GetSystemTimeAsFileTime(&f);
|
GetSystemTimeAsFileTime(&f);
|
||||||
t.QuadPart = f.dwHighDateTime;
|
t.QuadPart = f.dwHighDateTime;
|
||||||
t.QuadPart <<= 32;
|
t.QuadPart <<= 32;
|
||||||
|
|
45
insim.c
45
insim.c
|
@ -25,7 +25,8 @@
|
||||||
struct conninfo s_conninfo[256];
|
struct conninfo s_conninfo[256];
|
||||||
struct carinfo s_carinfo[256];
|
struct carinfo s_carinfo[256];
|
||||||
|
|
||||||
struct insim_buffer {
|
struct insim_buffer
|
||||||
|
{
|
||||||
int state;
|
int state;
|
||||||
uint8_t buffer[65536];
|
uint8_t buffer[65536];
|
||||||
int pos;
|
int pos;
|
||||||
|
@ -48,12 +49,14 @@ void insim_queue(const void *buffer, size_t size)
|
||||||
|
|
||||||
int insim_dequeue(int fd)
|
int insim_dequeue(int fd)
|
||||||
{
|
{
|
||||||
if (s_send_packet == NULL) queue_consume(s_send_queue, (void *)&s_send_packet);
|
if (s_send_packet == NULL)
|
||||||
|
queue_consume(s_send_queue, (void *)&s_send_packet);
|
||||||
|
|
||||||
if (s_send_packet != NULL)
|
if (s_send_packet != NULL)
|
||||||
{
|
{
|
||||||
ssize_t s = send(fd, (char *)s_send_packet + s_send_pos, s_send_packet[0] - s_send_pos, MSG_NOSIGNAL);
|
ssize_t s = send(fd, (char *)s_send_packet + s_send_pos, s_send_packet[0] - s_send_pos, MSG_NOSIGNAL);
|
||||||
if (s >= 0) s_send_pos += s;
|
if (s >= 0)
|
||||||
|
s_send_pos += s;
|
||||||
if (s_send_pos >= s_send_packet[0])
|
if (s_send_pos >= s_send_packet[0])
|
||||||
{
|
{
|
||||||
free(s_send_packet);
|
free(s_send_packet);
|
||||||
|
@ -105,8 +108,10 @@ void insim_handle_tiny(int fd, const void *buffer)
|
||||||
static void ltc_duty(const char *uname, int state)
|
static void ltc_duty(const char *uname, int state)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 256; i++) {
|
for (i = 0; i < 256; i++)
|
||||||
if (!strcmp(uname, s_conninfo[i].uname)) {
|
{
|
||||||
|
if (!strcmp(uname, s_conninfo[i].uname))
|
||||||
|
{
|
||||||
s_conninfo[i].state = state;
|
s_conninfo[i].state = state;
|
||||||
printf("Player %s state %d\n", uname, state);
|
printf("Player %s state %d\n", uname, state);
|
||||||
return;
|
return;
|
||||||
|
@ -135,16 +140,25 @@ void insim_handle_mso(int fd, const void *buffer)
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < 10; i++) {
|
for (i = 0; i < 10; i++)
|
||||||
|
{
|
||||||
char *a = strsep(&bufp, " ");
|
char *a = strsep(&bufp, " ");
|
||||||
if (a == NULL) return;
|
if (a == NULL)
|
||||||
if (i == 0 && strcmp(a, "***")) return;
|
return;
|
||||||
if (i == 1 && (!strcmp(a, "Officer") || !strcmp(a, "Cadet"))) state |= 1;
|
if (i == 0 && strcmp(a, "***"))
|
||||||
if (i == 2 && state == 1) name = a;
|
return;
|
||||||
if (i == 3 && strcmp(a, "has")) return;
|
if (i == 1 && (!strcmp(a, "Officer") || !strcmp(a, "Cadet")))
|
||||||
if (i == 4 && strcmp(a, "gone")) return;
|
state |= 1;
|
||||||
if (i == 5 && !strcmp(a, "onduty")) ltc_duty(name, 1);
|
if (i == 2 && state == 1)
|
||||||
if (i == 5 && !strcmp(a, "offduty")) ltc_duty(name, 0);
|
name = a;
|
||||||
|
if (i == 3 && strcmp(a, "has"))
|
||||||
|
return;
|
||||||
|
if (i == 4 && strcmp(a, "gone"))
|
||||||
|
return;
|
||||||
|
if (i == 5 && !strcmp(a, "onduty"))
|
||||||
|
ltc_duty(name, 1);
|
||||||
|
if (i == 5 && !strcmp(a, "offduty"))
|
||||||
|
ltc_duty(name, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +186,8 @@ void insim_handle_cpr(int fd, const void *buffer)
|
||||||
{
|
{
|
||||||
const struct IS_CPR *p = buffer;
|
const struct IS_CPR *p = buffer;
|
||||||
struct conninfo *c = s_conninfo + p->UCID;
|
struct conninfo *c = s_conninfo + p->UCID;
|
||||||
if (c->active == 0) fprintf(stderr, "Rename of inactive connection\n");
|
if (c->active == 0)
|
||||||
|
fprintf(stderr, "Rename of inactive connection\n");
|
||||||
strncpy(c->pname, p->PName, sizeof c->pname);
|
strncpy(c->pname, p->PName, sizeof c->pname);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
32
insim.h
32
insim.h
|
@ -14,13 +14,11 @@
|
||||||
|
|
||||||
// NOTE : This text file was written with a TAB size equal to 4 spaces.
|
// NOTE : This text file was written with a TAB size equal to 4 spaces.
|
||||||
|
|
||||||
|
|
||||||
// INSIM VERSION NUMBER (updated for version 0.6B)
|
// INSIM VERSION NUMBER (updated for version 0.6B)
|
||||||
// ====================
|
// ====================
|
||||||
|
|
||||||
static const int INSIM_VERSION = 5;
|
static const int INSIM_VERSION = 5;
|
||||||
|
|
||||||
|
|
||||||
// CHANGES
|
// CHANGES
|
||||||
// =======
|
// =======
|
||||||
|
|
||||||
|
@ -51,7 +49,6 @@ static const int INSIM_VERSION = 5;
|
||||||
// FIX : OutGaugePack ID was always zero regardless of ID in cfg.txt
|
// FIX : OutGaugePack ID was always zero regardless of ID in cfg.txt
|
||||||
// FIX : InSim camera with vertical pitch would cause LFS to crash
|
// FIX : InSim camera with vertical pitch would cause LFS to crash
|
||||||
|
|
||||||
|
|
||||||
// TYPES : (all multi-byte types are PC style - lowest byte first)
|
// TYPES : (all multi-byte types are PC style - lowest byte first)
|
||||||
// =====
|
// =====
|
||||||
|
|
||||||
|
@ -70,7 +67,6 @@ static const int INSIM_VERSION = 5;
|
||||||
// 100-190 : 100 to 1000 laps... laps = (rl - 100) * 10 + 100
|
// 100-190 : 100 to 1000 laps... laps = (rl - 100) * 10 + 100
|
||||||
// 191-238 : 1 to 48 hours... hours = rl - 190
|
// 191-238 : 1 to 48 hours... hours = rl - 190
|
||||||
|
|
||||||
|
|
||||||
// InSim PACKETS
|
// InSim PACKETS
|
||||||
// =============
|
// =============
|
||||||
|
|
||||||
|
@ -81,7 +77,6 @@ static const int INSIM_VERSION = 5;
|
||||||
// ReqI : non zero if the packet is a packet request or a reply to a request
|
// ReqI : non zero if the packet is a packet request or a reply to a request
|
||||||
// Data : the first data byte
|
// Data : the first data byte
|
||||||
|
|
||||||
|
|
||||||
// INITIALISING InSim
|
// INITIALISING InSim
|
||||||
// ==================
|
// ==================
|
||||||
|
|
||||||
|
@ -167,7 +162,6 @@ struct IS_ISI // InSim Init - packet to initialise the InSim system
|
||||||
// Messages typed with this prefix will be sent to your InSim program
|
// Messages typed with this prefix will be sent to your InSim program
|
||||||
// on the host (in IS_MSO) and not displayed on anyone's screen.
|
// on the host (in IS_MSO) and not displayed on anyone's screen.
|
||||||
|
|
||||||
|
|
||||||
// ENUMERATIONS FOR PACKET TYPES
|
// ENUMERATIONS FOR PACKET TYPES
|
||||||
// =============================
|
// =============================
|
||||||
|
|
||||||
|
@ -270,7 +264,6 @@ enum // the fourth byte of an IS_SMALL packet is one of these
|
||||||
SMALL_NLI, // 7 - instruction : set node lap interval
|
SMALL_NLI, // 7 - instruction : set node lap interval
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// GENERAL PURPOSE PACKETS - IS_TINY (4 bytes) and IS_SMALL (8 bytes)
|
// GENERAL PURPOSE PACKETS - IS_TINY (4 bytes) and IS_SMALL (8 bytes)
|
||||||
// =======================
|
// =======================
|
||||||
|
|
||||||
|
@ -300,7 +293,6 @@ struct IS_SMALL // General purpose 8 byte packet
|
||||||
uint32_t UVal; // value (e.g. for SMALL_SSP this would be the OutSim packet rate)
|
uint32_t UVal; // value (e.g. for SMALL_SSP this would be the OutSim packet rate)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// VERSION REQUEST
|
// VERSION REQUEST
|
||||||
// ===============
|
// ===============
|
||||||
|
|
||||||
|
@ -327,7 +319,6 @@ struct IS_VER // VERsion
|
||||||
// ReqI : non-zero (returned in the reply)
|
// ReqI : non-zero (returned in the reply)
|
||||||
// SubT : TINY_VER (request an IS_VER)
|
// SubT : TINY_VER (request an IS_VER)
|
||||||
|
|
||||||
|
|
||||||
// CLOSING InSim
|
// CLOSING InSim
|
||||||
// =============
|
// =============
|
||||||
|
|
||||||
|
@ -341,7 +332,6 @@ struct IS_VER // VERsion
|
||||||
// You can shut down InSim completely and stop it listening at all by typing /insim=0
|
// You can shut down InSim completely and stop it listening at all by typing /insim=0
|
||||||
// into LFS (or send a MsgTypePack to do the same thing).
|
// into LFS (or send a MsgTypePack to do the same thing).
|
||||||
|
|
||||||
|
|
||||||
// MAINTAINING THE CONNECTION - IMPORTANT
|
// MAINTAINING THE CONNECTION - IMPORTANT
|
||||||
// ==========================
|
// ==========================
|
||||||
|
|
||||||
|
@ -369,7 +359,6 @@ struct IS_VER // VERsion
|
||||||
// ReqI : non-zero (as received in the request packet)
|
// ReqI : non-zero (as received in the request packet)
|
||||||
// SubT : TINY_REPLY (reply to ping)
|
// SubT : TINY_REPLY (reply to ping)
|
||||||
|
|
||||||
|
|
||||||
// STATE REPORTING AND REQUESTS
|
// STATE REPORTING AND REQUESTS
|
||||||
// ============================
|
// ============================
|
||||||
|
|
||||||
|
@ -453,7 +442,6 @@ struct IS_SFP // State Flags Pack
|
||||||
|
|
||||||
// Other states must be set by using keypresses or messages (see below)
|
// Other states must be set by using keypresses or messages (see below)
|
||||||
|
|
||||||
|
|
||||||
// SCREEN MODE
|
// SCREEN MODE
|
||||||
// ===========
|
// ===========
|
||||||
|
|
||||||
|
@ -478,7 +466,6 @@ struct IS_MOD // MODe : send to LFS to change screen mode
|
||||||
|
|
||||||
// If Width and Height are both zero, LFS will switch to windowed mode.
|
// If Width and Height are both zero, LFS will switch to windowed mode.
|
||||||
|
|
||||||
|
|
||||||
// TEXT MESSAGES AND KEY PRESSES
|
// TEXT MESSAGES AND KEY PRESSES
|
||||||
// ==============================
|
// ==============================
|
||||||
|
|
||||||
|
@ -625,7 +612,6 @@ struct IS_SCH // Single CHaracter
|
||||||
uint8_t Spare3;
|
uint8_t Spare3;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// MULTIPLAYER NOTIFICATION
|
// MULTIPLAYER NOTIFICATION
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
|
@ -658,7 +644,6 @@ struct IS_ISM // InSim Multi
|
||||||
|
|
||||||
// NOTE : If LFS is not in multiplayer mode, the host name in the ISM will be empty.
|
// NOTE : If LFS is not in multiplayer mode, the host name in the ISM will be empty.
|
||||||
|
|
||||||
|
|
||||||
// VOTE NOTIFY AND CANCEL
|
// VOTE NOTIFY AND CANCEL
|
||||||
// ======================
|
// ======================
|
||||||
|
|
||||||
|
@ -704,7 +689,6 @@ struct IS_VTN // VoTe Notify
|
||||||
// ReqI : 0
|
// ReqI : 0
|
||||||
// SubT : TINY_VTC (VoTe Cancel)
|
// SubT : TINY_VTC (VoTe Cancel)
|
||||||
|
|
||||||
|
|
||||||
// ALLOWED CARS
|
// ALLOWED CARS
|
||||||
// ============
|
// ============
|
||||||
|
|
||||||
|
@ -752,7 +736,6 @@ struct IS_PLC // PLayer Cars
|
||||||
// BMW SAUBER F1.06 - 0x40000
|
// BMW SAUBER F1.06 - 0x40000
|
||||||
// FORMULA BMW FB02 - 0x80000
|
// FORMULA BMW FB02 - 0x80000
|
||||||
|
|
||||||
|
|
||||||
// RACE TRACKING
|
// RACE TRACKING
|
||||||
// =============
|
// =============
|
||||||
|
|
||||||
|
@ -1313,7 +1296,6 @@ static const int NOT_CHANGED = 255;
|
||||||
// bit 6 female
|
// bit 6 female
|
||||||
// bit 7 rear right
|
// bit 7 rear right
|
||||||
|
|
||||||
|
|
||||||
// TRACKING PACKET REQUESTS
|
// TRACKING PACKET REQUESTS
|
||||||
// ========================
|
// ========================
|
||||||
|
|
||||||
|
@ -1327,7 +1309,6 @@ static const int NOT_CHANGED = 255;
|
||||||
// SubT : TINY_NLP - request a single IS_NLP
|
// SubT : TINY_NLP - request a single IS_NLP
|
||||||
// SubT : TINY_MCI - request a set of IS_MCI
|
// SubT : TINY_MCI - request a set of IS_MCI
|
||||||
|
|
||||||
|
|
||||||
// AUTOCROSS
|
// AUTOCROSS
|
||||||
// =========
|
// =========
|
||||||
|
|
||||||
|
@ -1372,7 +1353,6 @@ struct IS_AXO // AutoX Object
|
||||||
uint8_t PLID; // player's unique id
|
uint8_t PLID; // player's unique id
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// CAR TRACKING - car position info sent at constant intervals
|
// CAR TRACKING - car position info sent at constant intervals
|
||||||
// ============
|
// ============
|
||||||
|
|
||||||
|
@ -1452,7 +1432,6 @@ struct IS_MCI // Multi Car Info - if more than 8 in race then more than one of t
|
||||||
// SubT : SMALL_NLI (Node Lap Interval)
|
// SubT : SMALL_NLI (Node Lap Interval)
|
||||||
// UVal : interval (0 means stop, otherwise time interval : 40, 50, 60... 8000 ms)
|
// UVal : interval (0 means stop, otherwise time interval : 40, 50, 60... 8000 ms)
|
||||||
|
|
||||||
|
|
||||||
// CONTACT - reports contacts between two cars if the closing speed is above 0.25 m/s
|
// CONTACT - reports contacts between two cars if the closing speed is above 0.25 m/s
|
||||||
// =======
|
// =======
|
||||||
|
|
||||||
|
@ -1529,7 +1508,6 @@ struct IS_OBH // OBject Hit - car hit an autocross object or an unknown object
|
||||||
|
|
||||||
//'BBBBHHBBBBhhhhBBBB'
|
//'BBBBHHBBBBhhhhBBBB'
|
||||||
|
|
||||||
|
|
||||||
// OBHFlags byte
|
// OBHFlags byte
|
||||||
|
|
||||||
#define OBH_LAYOUT 1 // an added object
|
#define OBH_LAYOUT 1 // an added object
|
||||||
|
@ -1553,7 +1531,6 @@ struct IS_HLV // Hot Lap Validity - illegal ground / hit wall / speeding in pit
|
||||||
struct CarContOBJ C;
|
struct CarContOBJ C;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// AUTOCROSS OBJECTS - reporting / adding / removing
|
// AUTOCROSS OBJECTS - reporting / adding / removing
|
||||||
// =================
|
// =================
|
||||||
|
|
||||||
|
@ -1632,7 +1609,6 @@ enum
|
||||||
// the corresponding IS_AXM that will be output when the packet is processed. Then
|
// the corresponding IS_AXM that will be output when the packet is processed. Then
|
||||||
// you can send the second packet and again wait for the IS_AXM and so on.
|
// you can send the second packet and again wait for the IS_AXM and so on.
|
||||||
|
|
||||||
|
|
||||||
// CAR POSITION PACKETS (Initialising OutSim from InSim - See "OutSim" below)
|
// CAR POSITION PACKETS (Initialising OutSim from InSim - See "OutSim" below)
|
||||||
// ====================
|
// ====================
|
||||||
|
|
||||||
|
@ -1652,7 +1628,6 @@ enum
|
||||||
|
|
||||||
// NOTE : OutSim packets are not InSim packets and don't have a 4-byte header.
|
// NOTE : OutSim packets are not InSim packets and don't have a 4-byte header.
|
||||||
|
|
||||||
|
|
||||||
// DASHBOARD PACKETS (Initialising OutGauge from InSim - See "OutGauge" below)
|
// DASHBOARD PACKETS (Initialising OutGauge from InSim - See "OutGauge" below)
|
||||||
// =================
|
// =================
|
||||||
|
|
||||||
|
@ -1672,7 +1647,6 @@ enum
|
||||||
|
|
||||||
// NOTE : OutGauge packets are not InSim packets and don't have a 4-byte header.
|
// NOTE : OutGauge packets are not InSim packets and don't have a 4-byte header.
|
||||||
|
|
||||||
|
|
||||||
// CAMERA CONTROL
|
// CAMERA CONTROL
|
||||||
// ==============
|
// ==============
|
||||||
|
|
||||||
|
@ -1773,7 +1747,6 @@ struct IS_CPP // Cam Pos Pack - Full camera packet (in car OR SHIFT+U mode)
|
||||||
// and later send back exactly the same packet to LFS and it will try to replicate
|
// and later send back exactly the same packet to LFS and it will try to replicate
|
||||||
// that camera position.
|
// that camera position.
|
||||||
|
|
||||||
|
|
||||||
// TIME CONTROL
|
// TIME CONTROL
|
||||||
// ============
|
// ============
|
||||||
|
|
||||||
|
@ -1806,7 +1779,6 @@ struct IS_CPP // Cam Pos Pack - Full camera packet (in car OR SHIFT+U mode)
|
||||||
// SubT : SMALL_STP (STeP)
|
// SubT : SMALL_STP (STeP)
|
||||||
// UVal : number (number of hundredths of a second to update)
|
// UVal : number (number of hundredths of a second to update)
|
||||||
|
|
||||||
|
|
||||||
// REPLAY CONTROL
|
// REPLAY CONTROL
|
||||||
// ==============
|
// ==============
|
||||||
|
|
||||||
|
@ -1868,7 +1840,6 @@ enum
|
||||||
// NOTE : RIPOPT_FULL_PHYS makes MPR searching much slower so should not normally be used.
|
// NOTE : RIPOPT_FULL_PHYS makes MPR searching much slower so should not normally be used.
|
||||||
// This flag was added to allow high accuracy MCI packets to be output when fast forwarding.
|
// This flag was added to allow high accuracy MCI packets to be output when fast forwarding.
|
||||||
|
|
||||||
|
|
||||||
// SCREENSHOTS
|
// SCREENSHOTS
|
||||||
// ===========
|
// ===========
|
||||||
|
|
||||||
|
@ -1902,7 +1873,6 @@ enum
|
||||||
SSH_NO_SAVE, // 3 - could not save the screenshot
|
SSH_NO_SAVE, // 3 - could not save the screenshot
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// BUTTONS
|
// BUTTONS
|
||||||
// =======
|
// =======
|
||||||
|
|
||||||
|
@ -2077,7 +2047,6 @@ struct IS_BTT // BuTton Type - sent back when user types into a text entry butto
|
||||||
char Text[96]; // typed text, zero to TypeIn specified in IS_BTN
|
char Text[96]; // typed text, zero to TypeIn specified in IS_BTN
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// OutSim - MOTION SIMULATOR SUPPORT
|
// OutSim - MOTION SIMULATOR SUPPORT
|
||||||
// ======
|
// ======
|
||||||
|
|
||||||
|
@ -2116,7 +2085,6 @@ struct OutSimPack
|
||||||
// not support any motion systems in particular and cannot accept responsibility
|
// not support any motion systems in particular and cannot accept responsibility
|
||||||
// for injuries or deaths connected with the use of such machinery.
|
// for injuries or deaths connected with the use of such machinery.
|
||||||
|
|
||||||
|
|
||||||
// OutGauge - EXTERNAL DASHBOARD SUPPORT
|
// OutGauge - EXTERNAL DASHBOARD SUPPORT
|
||||||
// ========
|
// ========
|
||||||
|
|
||||||
|
|
269
lfsdash.c
269
lfsdash.c
|
@ -1,9 +1,11 @@
|
||||||
#include <GL/glfw.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <FTGL/ftgl.h>
|
#include <FTGL/ftgl.h>
|
||||||
|
#include <SOIL/SOIL.h>
|
||||||
#include <pthread.h>
|
#include <pthread.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
#include <unistd.h>
|
||||||
#include "outgauge.h"
|
#include "outgauge.h"
|
||||||
#include "cars.h"
|
#include "cars.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -16,7 +18,8 @@
|
||||||
|
|
||||||
static GLuint s_symbols[1];
|
static GLuint s_symbols[1];
|
||||||
|
|
||||||
struct sympos {
|
struct sympos
|
||||||
|
{
|
||||||
float a, b, c, d;
|
float a, b, c, d;
|
||||||
int flag;
|
int flag;
|
||||||
struct colour off;
|
struct colour off;
|
||||||
|
@ -39,8 +42,7 @@ struct sympos {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int dl_to_sympos[] = {
|
static int dl_to_sympos[] = {
|
||||||
18, 0, 12, 17, 11, 15, 16, 2, 10, 9, 14, 13
|
18, 0, 12, 17, 11, 15, 16, 2, 10, 9, 14, 13};
|
||||||
};
|
|
||||||
|
|
||||||
static struct sympos s_sympos[] = {
|
static struct sympos s_sympos[] = {
|
||||||
{0.0, 0.0, 0.125, 0.125, (1 << DL_FULLBEAM), {0.1, 0.1, 0.1, 1.0}, {0.15, 0.15, 1.0, 1.0}},
|
{0.0, 0.0, 0.125, 0.125, (1 << DL_FULLBEAM), {0.1, 0.1, 0.1, 1.0}, {0.15, 0.15, 1.0, 1.0}},
|
||||||
|
@ -72,14 +74,18 @@ static struct sympos s_sympos[] = {
|
||||||
|
|
||||||
void drawSymbol(int symbol, int on, int map)
|
void drawSymbol(int symbol, int on, int map)
|
||||||
{
|
{
|
||||||
if (map) symbol = dl_to_sympos[symbol];
|
if (map)
|
||||||
|
symbol = dl_to_sympos[symbol];
|
||||||
|
|
||||||
struct sympos *s = &s_sympos[symbol];
|
struct sympos *s = &s_sympos[symbol];
|
||||||
glEnable(GL_TEXTURE_2D);
|
glEnable(GL_TEXTURE_2D);
|
||||||
glBindTexture(GL_TEXTURE_2D, s_symbols[0]);
|
glBindTexture(GL_TEXTURE_2D, s_symbols[0]);
|
||||||
if (on) {
|
if (on)
|
||||||
|
{
|
||||||
glColor4f(s->on.r, s->on.g, s->on.b, s->on.a);
|
glColor4f(s->on.r, s->on.g, s->on.b, s->on.a);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
glColor4f(s->off.r, s->off.g, s->off.b, s->off.a);
|
glColor4f(s->off.r, s->off.g, s->off.b, s->off.a);
|
||||||
}
|
}
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
|
@ -123,17 +129,28 @@ int main(int argc, char **argv)
|
||||||
float warn_fuel2;
|
float warn_fuel2;
|
||||||
|
|
||||||
config_init("lfsdash.txt");
|
config_init("lfsdash.txt");
|
||||||
if (!config_get_int("port", &g_outgauge_port)) g_outgauge_port = 4000;
|
if (!config_get_int("port", &g_outgauge_port))
|
||||||
if (!config_get_int("fullscreen", &fullscreen)) fullscreen = 0;
|
g_outgauge_port = 4000;
|
||||||
if (!config_get_int("width", &width)) width = 1024;
|
if (!config_get_int("fullscreen", &fullscreen))
|
||||||
if (!config_get_int("height", &height)) height = 600;
|
fullscreen = 0;
|
||||||
if (!config_get_int("volume", &volume)) volume = 100;
|
if (!config_get_int("width", &width))
|
||||||
if (!config_get_int("rpmleft", &rpmleft)) rpmleft = 0;
|
width = 1024;
|
||||||
if (!config_get_int("fade", &dofade)) dofade = 1;
|
if (!config_get_int("height", &height))
|
||||||
if (!config_get_string("insim_host", &insim_host)) insim_host = strdup("localhost");
|
height = 600;
|
||||||
if (!config_get_int("insim_port", &g_insim_port)) g_insim_port = 29999;
|
if (!config_get_int("volume", &volume))
|
||||||
if (!config_get_float("warn_fuel1", &warn_fuel1)) warn_fuel1 = 0.05f;
|
volume = 100;
|
||||||
if (!config_get_float("warn_fuel2", &warn_fuel2)) warn_fuel2 = 0.01f;
|
if (!config_get_int("rpmleft", &rpmleft))
|
||||||
|
rpmleft = 0;
|
||||||
|
if (!config_get_int("fade", &dofade))
|
||||||
|
dofade = 1;
|
||||||
|
if (!config_get_string("insim_host", &insim_host))
|
||||||
|
insim_host = strdup("localhost");
|
||||||
|
if (!config_get_int("insim_port", &g_insim_port))
|
||||||
|
g_insim_port = 29999;
|
||||||
|
if (!config_get_float("warn_fuel1", &warn_fuel1))
|
||||||
|
warn_fuel1 = 0.05f;
|
||||||
|
if (!config_get_float("warn_fuel2", &warn_fuel2))
|
||||||
|
warn_fuel2 = 0.01f;
|
||||||
|
|
||||||
network_worker_init();
|
network_worker_init();
|
||||||
|
|
||||||
|
@ -143,14 +160,16 @@ int main(int argc, char **argv)
|
||||||
init_cars();
|
init_cars();
|
||||||
|
|
||||||
glfwInit();
|
glfwInit();
|
||||||
glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 1);
|
glfwWindowHint(GLFW_SAMPLES, 1);
|
||||||
if (!glfwOpenWindow(width, height, 0, 0, 0, 0, 0, 0, fullscreen ? GLFW_FULLSCREEN : GLFW_WINDOW))
|
GLFWwindow *window = glfwCreateWindow(width, height, "GL LFS Dashboard", fullscreen ? glfwGetPrimaryMonitor() : NULL, NULL);
|
||||||
|
if (window == NULL)
|
||||||
{
|
{
|
||||||
|
printf("Could not create window\n");
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSetWindowTitle("GL LFS Dashboard");
|
glfwSetWindowTitle(window, "GL LFS Dashboard");
|
||||||
|
|
||||||
audio_init();
|
audio_init();
|
||||||
|
|
||||||
|
@ -387,15 +406,21 @@ int main(int argc, char **argv)
|
||||||
pthread_t thread;
|
pthread_t thread;
|
||||||
pthread_create(&thread, NULL, &socket_run, NULL);
|
pthread_create(&thread, NULL, &socket_run, NULL);
|
||||||
|
|
||||||
FTGLfont *font = ftglCreateTextureFont("arialbd.ttf");//"Arial.ttf");//"/usr/share/fonts/truetype/msttcorefonts/Arial.ttf");
|
FTGLfont *font = ftglCreateOutlineFont("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf"); //"Arial.ttf");//"/usr/share/fonts/truetype/msttcorefonts/Arial.ttf");
|
||||||
// DS_DIGII
|
// DS_DIGII
|
||||||
if (!font) return 0;
|
if (!font) {
|
||||||
|
fprintf(stderr, "Unable to open font\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ftglSetFontFaceSize(font, TEXT_SIZE, TEXT_SIZE);
|
ftglSetFontFaceSize(font, TEXT_SIZE, 0);
|
||||||
|
|
||||||
glGenTextures(1, s_symbols);
|
glGenTextures(1, s_symbols);
|
||||||
glBindTexture(GL_TEXTURE_2D, s_symbols[0]);
|
glBindTexture(GL_TEXTURE_2D, s_symbols[0]);
|
||||||
glfwLoadTexture2D("symbols512.tga", GLFW_BUILD_MIPMAPS_BIT);
|
SOIL_load_OGL_texture("symbols512.png", 0, 1, SOIL_FLAG_MIPMAPS);
|
||||||
|
// glfwLoadTexture2D("symbols512.tga", GLFW_BUILD_MIPMAPS_BIT);
|
||||||
|
// glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, )
|
||||||
|
|
||||||
// Use trilinear interpolation for minification
|
// Use trilinear interpolation for minification
|
||||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
|
||||||
// Use bilinear interpolation for magnification
|
// Use bilinear interpolation for magnification
|
||||||
|
@ -429,7 +454,8 @@ int main(int argc, char **argv)
|
||||||
float speedtimer = 0;
|
float speedtimer = 0;
|
||||||
float zoom = 65536.0;
|
float zoom = 65536.0;
|
||||||
|
|
||||||
while (running) {
|
while (running)
|
||||||
|
{
|
||||||
|
|
||||||
double curtime = glfwGetTime();
|
double curtime = glfwGetTime();
|
||||||
if (curtime >= next)
|
if (curtime >= next)
|
||||||
|
@ -438,19 +464,23 @@ int main(int argc, char **argv)
|
||||||
float interval = curtime - last_time;
|
float interval = curtime - last_time;
|
||||||
|
|
||||||
flash += interval;
|
flash += interval;
|
||||||
if (flash >= 1) flash = 0;
|
if (flash >= 1)
|
||||||
|
flash = 0;
|
||||||
|
|
||||||
if (bing == 2)
|
if (bing == 2)
|
||||||
{
|
{
|
||||||
binger += interval;
|
binger += interval;
|
||||||
if (binger >= 1) {
|
if (binger >= 1)
|
||||||
|
{
|
||||||
binger = 0;
|
binger = 0;
|
||||||
if (!g_fade) audio_play(3, FX_BING);
|
if (!g_fade)
|
||||||
|
audio_play(3, FX_BING);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
last_time = curtime;
|
last_time = curtime;
|
||||||
|
|
||||||
if (speedtimer > 0) {
|
if (speedtimer > 0)
|
||||||
|
{
|
||||||
speedtimer -= interval;
|
speedtimer -= interval;
|
||||||
if (speedtimer <= 0)
|
if (speedtimer <= 0)
|
||||||
{
|
{
|
||||||
|
@ -459,7 +489,8 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_pressed == 3) {
|
if (g_pressed == 3)
|
||||||
|
{
|
||||||
if (g_outgauge.time - g_shift_time > 1000 &&
|
if (g_outgauge.time - g_shift_time > 1000 &&
|
||||||
g_outgauge.time - g_ctrl_time > 1000)
|
g_outgauge.time - g_ctrl_time > 1000)
|
||||||
{
|
{
|
||||||
|
@ -474,18 +505,24 @@ int main(int argc, char **argv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ack == 0) {
|
if (ack == 0)
|
||||||
if (mode == 1) {
|
{
|
||||||
if (g_pressed == 1 && volume > 0) {
|
if (mode == 1)
|
||||||
|
{
|
||||||
|
if (g_pressed == 1 && volume > 0)
|
||||||
|
{
|
||||||
volume -= 10;
|
volume -= 10;
|
||||||
if (volume < 0) volume = 0;
|
if (volume < 0)
|
||||||
|
volume = 0;
|
||||||
audio_volume(volume * 0.01);
|
audio_volume(volume * 0.01);
|
||||||
audio_play(4, FX_BOP);
|
audio_play(4, FX_BOP);
|
||||||
ack = 1;
|
ack = 1;
|
||||||
}
|
}
|
||||||
if (g_pressed == 2 && volume < 100) {
|
if (g_pressed == 2 && volume < 100)
|
||||||
|
{
|
||||||
volume += 10;
|
volume += 10;
|
||||||
if (volume > 100) volume = 100;
|
if (volume > 100)
|
||||||
|
volume = 100;
|
||||||
audio_volume(volume * 0.01);
|
audio_volume(volume * 0.01);
|
||||||
audio_play(4, FX_BIP);
|
audio_play(4, FX_BIP);
|
||||||
ack = 1;
|
ack = 1;
|
||||||
|
@ -527,7 +564,7 @@ int main(int argc, char **argv)
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwGetWindowSize(&width, &height);
|
glfwGetFramebufferSize(window, &width, &height);
|
||||||
height = height > 0 ? height : 1;
|
height = height > 0 ? height : 1;
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
|
@ -555,7 +592,8 @@ int main(int argc, char **argv)
|
||||||
float speedunit = (g_outgauge.flags & OG_KM) ? 3.6 : 2.23693629;
|
float speedunit = (g_outgauge.flags & OG_KM) ? 3.6 : 2.23693629;
|
||||||
float distunit = (g_outgauge.flags & OG_KM) ? 0.001 : 0.0006215;
|
float distunit = (g_outgauge.flags & OG_KM) ? 0.001 : 0.0006215;
|
||||||
|
|
||||||
if (g_outgauge.speed > maxspeed) {
|
if (g_outgauge.speed > maxspeed)
|
||||||
|
{
|
||||||
maxspeed = g_outgauge.speed;
|
maxspeed = g_outgauge.speed;
|
||||||
speedtimer = 15.0f;
|
speedtimer = 15.0f;
|
||||||
}
|
}
|
||||||
|
@ -576,26 +614,35 @@ int main(int argc, char **argv)
|
||||||
speed.rangemax = car.maxspeed;
|
speed.rangemax = car.maxspeed;
|
||||||
speed2.rangemax = speed.rangemax * 1.609f;
|
speed2.rangemax = speed.rangemax * 1.609f;
|
||||||
}
|
}
|
||||||
if (hurr < 0) hurr = 0;
|
if (hurr < 0)
|
||||||
if (hurr > 100) hurr = 100;
|
hurr = 0;
|
||||||
|
if (hurr > 100)
|
||||||
|
hurr = 100;
|
||||||
|
|
||||||
if (speed.rangemax < 150) {
|
if (speed.rangemax < 150)
|
||||||
|
{
|
||||||
speed.majorstep = 10;
|
speed.majorstep = 10;
|
||||||
speed.minorstep = 2;
|
speed.minorstep = 2;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
speed.majorstep = 20;
|
speed.majorstep = 20;
|
||||||
speed.minorstep = 10;
|
speed.minorstep = 10;
|
||||||
}
|
}
|
||||||
if (speed2.rangemax < 150) {
|
if (speed2.rangemax < 150)
|
||||||
|
{
|
||||||
speed2.majorstep = 10;
|
speed2.majorstep = 10;
|
||||||
speed2.minorstep = 2;
|
speed2.minorstep = 2;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
speed2.majorstep = 20;
|
speed2.majorstep = 20;
|
||||||
speed2.minorstep = 10;
|
speed2.minorstep = 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
float gsize = width * 0.20;
|
float gsize = width * 0.20;
|
||||||
if (gsize > height * 0.4) gsize = height * 0.4;
|
if (gsize > height * 0.4)
|
||||||
|
gsize = height * 0.4;
|
||||||
speed.radius = gsize * 0.9;
|
speed.radius = gsize * 0.9;
|
||||||
speed2.radius = speed.radius * 0.6;
|
speed2.radius = speed.radius * 0.6;
|
||||||
rpm.radius = speed.radius;
|
rpm.radius = speed.radius;
|
||||||
|
@ -612,16 +659,20 @@ int main(int argc, char **argv)
|
||||||
float lsize = sgsize * 0.16;
|
float lsize = sgsize * 0.16;
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
if (rpmleft) {
|
if (rpmleft)
|
||||||
|
{
|
||||||
glTranslatef(width * 0.5 + gsize * 1.5, height - gsize, 0);
|
glTranslatef(width * 0.5 + gsize * 1.5, height - gsize, 0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
glTranslatef(width * 0.5 - gsize * 1.5, height - gsize, 0);
|
glTranslatef(width * 0.5 - gsize * 1.5, height - gsize, 0);
|
||||||
}
|
}
|
||||||
glColor4f(1.0, 1.0, 1.0, 1.0);
|
glColor4f(1.0, 1.0, 1.0, 1.0);
|
||||||
snprintf(text, sizeof text, "%d", (int)(g_outgauge.speed * speedunit));
|
snprintf(text, sizeof text, "%d", (int)(g_outgauge.speed * speedunit));
|
||||||
drawText(text, font, 20, -speed.radius * 0.8, msize, msize, TA_RIGHT, TA_BOTTOM);
|
drawText(text, font, 20, -speed.radius * 0.8, msize, msize, TA_RIGHT, TA_BOTTOM);
|
||||||
drawText((g_outgauge.flags & OG_KM) ? "km/h" : "mph", font, 26, -speed.radius * 0.8, msize * 0.3, msize * 0.4, TA_LEFT, TA_BOTTOM);
|
drawText((g_outgauge.flags & OG_KM) ? "km/h" : "mph", font, 26, -speed.radius * 0.8, msize * 0.3, msize * 0.4, TA_LEFT, TA_BOTTOM);
|
||||||
if (g_outgauge.dashlights & (1 << DL_PITSPEED)) {
|
if (g_outgauge.dashlights & (1 << DL_PITSPEED))
|
||||||
|
{
|
||||||
drawSymbol2(DL_PITSPEED, g_outgauge.showlights & (1 << DL_PITSPEED), 1, 0, gsize * -0.4, symsize * 1.3, symsize * 1.3);
|
drawSymbol2(DL_PITSPEED, g_outgauge.showlights & (1 << DL_PITSPEED), 1, 0, gsize * -0.4, symsize * 1.3, symsize * 1.3);
|
||||||
}
|
}
|
||||||
if (maxspeed > 0.001f)
|
if (maxspeed > 0.001f)
|
||||||
|
@ -641,31 +692,39 @@ int main(int argc, char **argv)
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
if (rpmleft) {
|
if (rpmleft)
|
||||||
|
{
|
||||||
glTranslatef(width * 0.5 - gsize * 1.5, height - gsize, 0);
|
glTranslatef(width * 0.5 - gsize * 1.5, height - gsize, 0);
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
glTranslatef(width * 0.5 + gsize * 1.5, height - gsize, 0);
|
glTranslatef(width * 0.5 + gsize * 1.5, height - gsize, 0);
|
||||||
}
|
}
|
||||||
glColor4f(1.0, 1.0, 1.0, 1.0);
|
glColor4f(1.0, 1.0, 1.0, 1.0);
|
||||||
snprintf(text, sizeof text, "%d", (int)(g_outgauge.rpm));
|
snprintf(text, sizeof text, "%d", (int)(g_outgauge.rpm));
|
||||||
drawText(text, font, 40, -rpm.radius * 0.8, msize, msize, TA_RIGHT, TA_BOTTOM);
|
drawText(text, font, 40, -rpm.radius * 0.8, msize, msize, TA_RIGHT, TA_BOTTOM);
|
||||||
drawText("rpm", font, 46, -rpm.radius * 0.8, msize * 0.3, msize * 0.4, TA_LEFT, TA_BOTTOM);
|
drawText("rpm", font, 46, -rpm.radius * 0.8, msize * 0.3, msize * 0.4, TA_LEFT, TA_BOTTOM);
|
||||||
if (g_outgauge.dashlights & (1 << DL_SHIFT)) {
|
if (g_outgauge.dashlights & (1 << DL_SHIFT))
|
||||||
|
{
|
||||||
drawSymbol2(DL_SHIFT, g_outgauge.showlights & (1 << DL_SHIFT), 1, 0, gsize * -0.4, symsize * 1.3, symsize * 1.3);
|
drawSymbol2(DL_SHIFT, g_outgauge.showlights & (1 << DL_SHIFT), 1, 0, gsize * -0.4, symsize * 1.3, symsize * 1.3);
|
||||||
}
|
}
|
||||||
draw_gauge(&rpm, g_outgauge.rpm, car.maxrpm, font, GT_NEEDLE);
|
draw_gauge(&rpm, g_outgauge.rpm, car.maxrpm, font, GT_NEEDLE);
|
||||||
glPopMatrix();
|
glPopMatrix();
|
||||||
|
|
||||||
if (g_owncar == g_outgauge.playerid) {
|
if (g_owncar == g_outgauge.playerid)
|
||||||
|
{
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glTranslatef(width * 0.5 - gsize * 1.5, fuel.radius * 0.75, 0);
|
glTranslatef(width * 0.5 - gsize * 1.5, fuel.radius * 0.75, 0);
|
||||||
drawSymbol2(4, 0, 0, fuel.radius * -0.65, 0, lsize, lsize);
|
drawSymbol2(4, 0, 0, fuel.radius * -0.65, 0, lsize, lsize);
|
||||||
if (g_outgauge.fuel <= warn_fuel2) {
|
if (g_outgauge.fuel <= warn_fuel2)
|
||||||
if (flash < 0.5) {
|
{
|
||||||
|
if (flash < 0.5)
|
||||||
|
{
|
||||||
drawSymbol2(19, 1, 0, -fuel.radius * 0.6, -fuel.radius * 0.3, lsize, lsize);
|
drawSymbol2(19, 1, 0, -fuel.radius * 0.6, -fuel.radius * 0.3, lsize, lsize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (g_outgauge.fuel <= warn_fuel1) {
|
else if (g_outgauge.fuel <= warn_fuel1)
|
||||||
|
{
|
||||||
drawSymbol2(19, 0, 0, -fuel.radius * 0.6, -fuel.radius * 0.3, lsize * 0.6, lsize * 0.6);
|
drawSymbol2(19, 0, 0, -fuel.radius * 0.6, -fuel.radius * 0.3, lsize * 0.6, lsize * 0.6);
|
||||||
}
|
}
|
||||||
draw_gauge(&fuel, g_outgauge.fuel, -1, font, GT_BAR);
|
draw_gauge(&fuel, g_outgauge.fuel, -1, font, GT_BAR);
|
||||||
|
@ -695,10 +754,13 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
if (g_outgauge.flags & OG_TURBO)
|
if (g_outgauge.flags & OG_TURBO)
|
||||||
{
|
{
|
||||||
if (g_outgauge.flags & OG_BAR) {
|
if (g_outgauge.flags & OG_BAR)
|
||||||
|
{
|
||||||
boost.majorstep = 0.4;
|
boost.majorstep = 0.4;
|
||||||
boost.minorstep = 0.1;
|
boost.minorstep = 0.1;
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
boost.majorstep = 2.0;
|
boost.majorstep = 2.0;
|
||||||
boost.minorstep = 1.0;
|
boost.minorstep = 1.0;
|
||||||
}
|
}
|
||||||
|
@ -747,33 +809,46 @@ int main(int argc, char **argv)
|
||||||
if (g_outgauge.dashlights & (1 << DL_SIGNAL_ANY))
|
if (g_outgauge.dashlights & (1 << DL_SIGNAL_ANY))
|
||||||
{
|
{
|
||||||
drawSymbol2(DL_SIGNAL_ANY, g_outgauge.showlights & (1 << DL_SIGNAL_ANY), 1, 0, 0, symsize, symsize);
|
drawSymbol2(DL_SIGNAL_ANY, g_outgauge.showlights & (1 << DL_SIGNAL_ANY), 1, 0, 0, symsize, symsize);
|
||||||
} else {
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_SIGNAL_L)) {
|
else
|
||||||
|
{
|
||||||
|
if (g_outgauge.dashlights & (1 << DL_SIGNAL_L))
|
||||||
|
{
|
||||||
drawSymbol2(DL_SIGNAL_L, g_outgauge.showlights & (1 << DL_SIGNAL_L), 1, -symsize * 0.75, 0, symsize, symsize);
|
drawSymbol2(DL_SIGNAL_L, g_outgauge.showlights & (1 << DL_SIGNAL_L), 1, -symsize * 0.75, 0, symsize, symsize);
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_SIGNAL_R)) {
|
if (g_outgauge.dashlights & (1 << DL_SIGNAL_R))
|
||||||
|
{
|
||||||
drawSymbol2(DL_SIGNAL_R, g_outgauge.showlights & (1 << DL_SIGNAL_R), 1, symsize * 0.75, 0, symsize, symsize);
|
drawSymbol2(DL_SIGNAL_R, g_outgauge.showlights & (1 << DL_SIGNAL_R), 1, symsize * 0.75, 0, symsize, symsize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_FULLBEAM)) {
|
if (g_outgauge.dashlights & (1 << DL_FULLBEAM))
|
||||||
|
{
|
||||||
drawSymbol2(DL_FULLBEAM, g_outgauge.showlights & (1 << DL_FULLBEAM), 1, 0, symspace, symsize, symsize);
|
drawSymbol2(DL_FULLBEAM, g_outgauge.showlights & (1 << DL_FULLBEAM), 1, 0, symspace, symsize, symsize);
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_HANDBRAKE)) {
|
if (g_outgauge.dashlights & (1 << DL_HANDBRAKE))
|
||||||
|
{
|
||||||
drawSymbol2(DL_HANDBRAKE, g_outgauge.showlights & (1 << DL_HANDBRAKE), 1, 0, symspace * 2, symsize, symsize);
|
drawSymbol2(DL_HANDBRAKE, g_outgauge.showlights & (1 << DL_HANDBRAKE), 1, 0, symspace * 2, symsize, symsize);
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_ABS)) {
|
if (g_outgauge.dashlights & (1 << DL_ABS))
|
||||||
|
{
|
||||||
drawSymbol2(DL_ABS, g_outgauge.showlights & (1 << DL_ABS), 1, 0, symspace * 3, symsize, symsize);
|
drawSymbol2(DL_ABS, g_outgauge.showlights & (1 << DL_ABS), 1, 0, symspace * 3, symsize, symsize);
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_TC)) {
|
if (g_outgauge.dashlights & (1 << DL_TC))
|
||||||
|
{
|
||||||
drawSymbol2(DL_TC, g_outgauge.showlights & (1 << DL_TC), 1, 0, symspace * 4, symsize, symsize);
|
drawSymbol2(DL_TC, g_outgauge.showlights & (1 << DL_TC), 1, 0, symspace * 4, symsize, symsize);
|
||||||
}
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_OILWARN)) {
|
if (g_outgauge.dashlights & (1 << DL_OILWARN))
|
||||||
if (g_outgauge.dashlights & (1 << DL_BATTERY)) {
|
{
|
||||||
|
if (g_outgauge.dashlights & (1 << DL_BATTERY))
|
||||||
|
{
|
||||||
drawSymbol2(DL_BATTERY, g_outgauge.showlights & (1 << DL_BATTERY), 1, -symsize * 0.75, symspace * 5, symsize, symsize);
|
drawSymbol2(DL_BATTERY, g_outgauge.showlights & (1 << DL_BATTERY), 1, -symsize * 0.75, symspace * 5, symsize, symsize);
|
||||||
}
|
}
|
||||||
drawSymbol2(DL_OILWARN, g_outgauge.showlights & (1 << DL_OILWARN), 1, symsize * 0.75, symspace * 5, symsize, symsize);
|
drawSymbol2(DL_OILWARN, g_outgauge.showlights & (1 << DL_OILWARN), 1, symsize * 0.75, symspace * 5, symsize, symsize);
|
||||||
} else {
|
}
|
||||||
if (g_outgauge.dashlights & (1 << DL_BATTERY)) {
|
else
|
||||||
|
{
|
||||||
|
if (g_outgauge.dashlights & (1 << DL_BATTERY))
|
||||||
|
{
|
||||||
drawSymbol2(DL_BATTERY, g_outgauge.showlights & (1 << DL_BATTERY), 1, 0, symspace * 5, symsize, symsize);
|
drawSymbol2(DL_BATTERY, g_outgauge.showlights & (1 << DL_BATTERY), 1, 0, symspace * 5, symsize, symsize);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -808,11 +883,16 @@ int main(int argc, char **argv)
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glColor4f(0.15, 0.15, 1.0, 1.0);
|
glColor4f(0.15, 0.15, 1.0, 1.0);
|
||||||
glTranslatef(width * 0.5, 0, 0.0f);
|
glTranslatef(width * 0.5, 0, 0.0f);
|
||||||
if (g_outgauge.gear == 0) {
|
if (g_outgauge.gear == 0)
|
||||||
|
{
|
||||||
snprintf(text, sizeof text, "R");
|
snprintf(text, sizeof text, "R");
|
||||||
} else if (g_outgauge.gear == 1) {
|
}
|
||||||
|
else if (g_outgauge.gear == 1)
|
||||||
|
{
|
||||||
snprintf(text, sizeof text, "N");
|
snprintf(text, sizeof text, "N");
|
||||||
} else {
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
snprintf(text, sizeof text, "%d", g_outgauge.gear - 1);
|
snprintf(text, sizeof text, "%d", g_outgauge.gear - 1);
|
||||||
}
|
}
|
||||||
drawText(text, font, 0, sgsize * 0.7, sgsize * 0.7, sgsize * 0.7, TA_CENTRE, TA_BOTTOM);
|
drawText(text, font, 0, sgsize * 0.7, sgsize * 0.7, sgsize * 0.7, TA_CENTRE, TA_BOTTOM);
|
||||||
|
@ -901,21 +981,29 @@ int main(int argc, char **argv)
|
||||||
int os3 = (g_outgauge.showlights & (1 << DL_SIGNAL_ANY)) ? FX_ON : FX_OFF;
|
int os3 = (g_outgauge.showlights & (1 << DL_SIGNAL_ANY)) ? FX_ON : FX_OFF;
|
||||||
int os6 = (g_outgauge.showlights & (1 << DL_PITSPEED)) ? FX_ON : FX_OFF;
|
int os6 = (g_outgauge.showlights & (1 << DL_PITSPEED)) ? FX_ON : FX_OFF;
|
||||||
|
|
||||||
if (s1 != os1) {
|
if (s1 != os1)
|
||||||
|
{
|
||||||
s1 = os1;
|
s1 = os1;
|
||||||
if (!g_fade) audio_play(0, s1);
|
if (!g_fade)
|
||||||
|
audio_play(0, s1);
|
||||||
}
|
}
|
||||||
if (s2 != os2) {
|
if (s2 != os2)
|
||||||
|
{
|
||||||
s2 = os2;
|
s2 = os2;
|
||||||
if (!g_fade) audio_play(1, s2);
|
if (!g_fade)
|
||||||
|
audio_play(1, s2);
|
||||||
}
|
}
|
||||||
if (s3 != os3) {
|
if (s3 != os3)
|
||||||
|
{
|
||||||
s3 = os3;
|
s3 = os3;
|
||||||
if (!g_fade) audio_play(2, s3);
|
if (!g_fade)
|
||||||
|
audio_play(2, s3);
|
||||||
}
|
}
|
||||||
if (s6 != os6) {
|
if (s6 != os6)
|
||||||
|
{
|
||||||
s6 = os6;
|
s6 = os6;
|
||||||
if (!g_fade) audio_play(5, s6);
|
if (!g_fade)
|
||||||
|
audio_play(5, s6);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_outgauge.fuel > warn_fuel1 || g_outgauge.rpm == 0)
|
if (g_outgauge.fuel > warn_fuel1 || g_outgauge.rpm == 0)
|
||||||
|
@ -929,18 +1017,23 @@ int main(int argc, char **argv)
|
||||||
else if (bing != 1 && g_outgauge.fuel <= warn_fuel1)
|
else if (bing != 1 && g_outgauge.fuel <= warn_fuel1)
|
||||||
{
|
{
|
||||||
bing = 1;
|
bing = 1;
|
||||||
if (!g_fade) audio_play(3, FX_BING);
|
if (!g_fade)
|
||||||
|
audio_play(3, FX_BING);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_fade && fade < 0.8) {
|
if (g_fade && fade < 0.8)
|
||||||
|
{
|
||||||
fade = fade + 0.01;
|
fade = fade + 0.01;
|
||||||
} else if (!g_fade && fade > 0.0) {
|
}
|
||||||
|
else if (!g_fade && fade > 0.0)
|
||||||
|
{
|
||||||
fade = fade - 0.01;
|
fade = fade - 0.01;
|
||||||
}
|
}
|
||||||
|
|
||||||
// glPopMatrix();
|
// glPopMatrix();
|
||||||
|
|
||||||
if (dofade && fade > 0) {
|
if (dofade && fade > 0)
|
||||||
|
{
|
||||||
glColor4f(0.0, 0.0, 0.0, fade);
|
glColor4f(0.0, 0.0, 0.0, fade);
|
||||||
glBegin(GL_QUADS);
|
glBegin(GL_QUADS);
|
||||||
glVertex3f(0.0, 0.0, 0.0);
|
glVertex3f(0.0, 0.0, 0.0);
|
||||||
|
@ -950,11 +1043,12 @@ int main(int argc, char **argv)
|
||||||
glEnd();
|
glEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
glfwSwapBuffers();
|
glfwSwapBuffers(window);
|
||||||
|
glfwPollEvents();
|
||||||
|
|
||||||
// printf("%f\n", g_outgauge.speed * 2.23693629);
|
// printf("%f\n", g_outgauge.speed * 2.23693629);
|
||||||
|
|
||||||
running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam( GLFW_OPENED) && !glfwGetMouseButton(1);
|
running = !glfwGetKey(window, GLFW_KEY_ESCAPE) && !glfwWindowShouldClose(window) && !glfwGetMouseButton(window, 1);
|
||||||
/*
|
/*
|
||||||
int wheel = glfwGetMouseWheel();
|
int wheel = glfwGetMouseWheel();
|
||||||
if (wheel >= 1) {
|
if (wheel >= 1) {
|
||||||
|
@ -965,7 +1059,7 @@ int main(int argc, char **argv)
|
||||||
*/
|
*/
|
||||||
// printf("%u %u %u\n", g_outgauge.flags, g_outgauge.dashlights, g_outgauge.showlights);
|
// printf("%u %u %u\n", g_outgauge.flags, g_outgauge.dashlights, g_outgauge.showlights);
|
||||||
|
|
||||||
usleep(100);
|
usleep(1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
s_running = 0;
|
s_running = 0;
|
||||||
|
@ -991,4 +1085,3 @@ int main(int argc, char **argv)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
6
list.h
6
list.h
|
@ -45,7 +45,8 @@ static inline void X ## _list_del_item(struct X ## _list_t *list, T item) \
|
||||||
size_t i; \
|
size_t i; \
|
||||||
for (i = 0; i < list->used; i++) \
|
for (i = 0; i < list->used; i++) \
|
||||||
{ \
|
{ \
|
||||||
if (compare_func(&list->items[i], &item)) { \
|
if (compare_func(&list->items[i], &item)) \
|
||||||
|
{ \
|
||||||
list->items[i] = list->items[--list->used]; \
|
list->items[i] = list->items[--list->used]; \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
|
@ -62,7 +63,8 @@ static inline int X ## _list_contains(struct X ## _list_t *list, T item) \
|
||||||
size_t i; \
|
size_t i; \
|
||||||
for (i = 0; i < list->used; i++) \
|
for (i = 0; i < list->used; i++) \
|
||||||
{ \
|
{ \
|
||||||
if (compare_func(&list->items[i], &item)) { \
|
if (compare_func(&list->items[i], &item)) \
|
||||||
|
{ \
|
||||||
return 1; \
|
return 1; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -188,7 +188,8 @@ int network_listen(int port, int tcp)
|
||||||
}
|
}
|
||||||
|
|
||||||
socket_set_nonblock(fd);
|
socket_set_nonblock(fd);
|
||||||
if (tcp) socket_set_nodelay(fd);
|
if (tcp)
|
||||||
|
socket_set_nodelay(fd);
|
||||||
|
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
12
outgauge.c
12
outgauge.c
|
@ -39,14 +39,17 @@ int outgauge_recv(int fd, int can_write, int can_read, void *arg)
|
||||||
/* Ignore out of order packet */
|
/* Ignore out of order packet */
|
||||||
// if (o.time < s_prev_time)
|
// if (o.time < s_prev_time)
|
||||||
|
|
||||||
if (o.rpm < 0) o.rpm = 0;
|
if (o.rpm < 0)
|
||||||
|
o.rpm = 0;
|
||||||
memcpy(&g_outgauge, &o, len);
|
memcpy(&g_outgauge, &o, len);
|
||||||
g_fade &= ~1;
|
g_fade &= ~1;
|
||||||
|
|
||||||
g_released |= g_pressed & (~(o.flags & 3));
|
g_released |= g_pressed & (~(o.flags & 3));
|
||||||
|
|
||||||
if (!(g_pressed & 1) && (o.flags & 1)) g_shift_time = o.time;
|
if (!(g_pressed & 1) && (o.flags & 1))
|
||||||
if (!(g_pressed & 2) && (o.flags & 2)) g_ctrl_time = o.time;
|
g_shift_time = o.time;
|
||||||
|
if (!(g_pressed & 2) && (o.flags & 2))
|
||||||
|
g_ctrl_time = o.time;
|
||||||
g_pressed |= (o.flags & 3);
|
g_pressed |= (o.flags & 3);
|
||||||
|
|
||||||
if (g_owncar != o.playerid)
|
if (g_owncar != o.playerid)
|
||||||
|
@ -100,6 +103,7 @@ int outgauge_recv(int fd, int can_write, int can_read, void *arg)
|
||||||
void outgauge_init(int port)
|
void outgauge_init(int port)
|
||||||
{
|
{
|
||||||
int fd = network_listen(port, 0);
|
int fd = network_listen(port, 0);
|
||||||
if (fd < 0) return;
|
if (fd < 0)
|
||||||
|
return;
|
||||||
register_socket(fd, SM_READ, &outgauge_recv, NULL);
|
register_socket(fd, SM_READ, &outgauge_recv, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,7 +37,6 @@ extern int g_released;
|
||||||
extern uint32_t g_shift_time;
|
extern uint32_t g_shift_time;
|
||||||
extern uint32_t g_ctrl_time;
|
extern uint32_t g_ctrl_time;
|
||||||
|
|
||||||
|
|
||||||
void outgauge_init(int port);
|
void outgauge_init(int port);
|
||||||
|
|
||||||
#endif /* OUTGAUGE_H */
|
#endif /* OUTGAUGE_H */
|
||||||
|
|
3
queue.c
3
queue.c
|
@ -55,7 +55,8 @@ void queue_delete(struct queue_t *queue)
|
||||||
|
|
||||||
int queue_produce(struct queue_t *queue, void *data)
|
int queue_produce(struct queue_t *queue, void *data)
|
||||||
{
|
{
|
||||||
if (queue == NULL) return 0;
|
if (queue == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
struct queue_object_t *qo = malloc(sizeof *qo);
|
struct queue_object_t *qo = malloc(sizeof *qo);
|
||||||
qo->next = NULL;
|
qo->next = NULL;
|
||||||
|
|
30
socket.c
30
socket.c
|
@ -54,7 +54,8 @@ static struct socket_t *socket_get_by_fd(int fd)
|
||||||
for (i = 0; i < s_sockets.used; i++)
|
for (i = 0; i < s_sockets.used; i++)
|
||||||
{
|
{
|
||||||
struct socket_t *s = s_sockets.items[i];
|
struct socket_t *s = s_sockets.items[i];
|
||||||
if (s->fd == fd) return s;
|
if (s->fd == fd)
|
||||||
|
return s;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -76,14 +77,16 @@ void register_socket(int fd, int mode, socket_func socket_func, void *arg)
|
||||||
if (s_epoll_fd == -1)
|
if (s_epoll_fd == -1)
|
||||||
{
|
{
|
||||||
s_epoll_fd = epoll_create(32);
|
s_epoll_fd = epoll_create(32);
|
||||||
if (s_epoll_fd == -1) fprintf(stderr, "register_socket(): epoll_create: %s\n", strerror(errno));
|
if (s_epoll_fd == -1)
|
||||||
|
fprintf(stderr, "register_socket(): epoll_create: %s\n", strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
ev.events = EPOLLIN;
|
ev.events = EPOLLIN;
|
||||||
ev.data.ptr = s;
|
ev.data.ptr = s;
|
||||||
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_ADD, fd, &ev);
|
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_ADD, fd, &ev);
|
||||||
if (r == -1) fprintf(stderr, "register_socket(): epoll_ctl: %s\n", strerror(errno));
|
if (r == -1)
|
||||||
|
fprintf(stderr, "register_socket(): epoll_ctl: %s\n", strerror(errno));
|
||||||
#endif /* USE_POLL */
|
#endif /* USE_POLL */
|
||||||
|
|
||||||
pthread_mutex_unlock(&s_sockets_mutex);
|
pthread_mutex_unlock(&s_sockets_mutex);
|
||||||
|
@ -94,9 +97,11 @@ void socket_flag_write(int fd)
|
||||||
#ifdef USE_POLL
|
#ifdef USE_POLL
|
||||||
struct epoll_event ev;
|
struct epoll_event ev;
|
||||||
ev.events = EPOLLIN | EPOLLOUT;
|
ev.events = EPOLLIN | EPOLLOUT;
|
||||||
ev.data.ptr = socket_get_by_fd(fd);;
|
ev.data.ptr = socket_get_by_fd(fd);
|
||||||
|
;
|
||||||
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_MOD, fd, &ev);
|
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_MOD, fd, &ev);
|
||||||
if (r == -1) fprintf(stderr, "socket_flag_write(): epoll_ctl: %s\n", strerror(errno));
|
if (r == -1)
|
||||||
|
fprintf(stderr, "socket_flag_write(): epoll_ctl: %s\n", strerror(errno));
|
||||||
#endif /* USE_POLL */
|
#endif /* USE_POLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +112,8 @@ void socket_clear_write(int fd)
|
||||||
ev.events = EPOLLIN;
|
ev.events = EPOLLIN;
|
||||||
ev.data.ptr = socket_get_by_fd(fd);
|
ev.data.ptr = socket_get_by_fd(fd);
|
||||||
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_MOD, fd, &ev);
|
int r = epoll_ctl(s_epoll_fd, EPOLL_CTL_MOD, fd, &ev);
|
||||||
if (r == -1) fprintf(stderr, "socket_clear_write(): epoll_ctl: %s\n", strerror(errno));
|
if (r == -1)
|
||||||
|
fprintf(stderr, "socket_clear_write(): epoll_ctl: %s\n", strerror(errno));
|
||||||
#endif /* USE_POLL */
|
#endif /* USE_POLL */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +188,8 @@ void *socket_run(void *arg)
|
||||||
{
|
{
|
||||||
struct epoll_event events[EPOLL_EVENTS];
|
struct epoll_event events[EPOLL_EVENTS];
|
||||||
int n = epoll_wait(s_epoll_fd, events, EPOLL_EVENTS, 10000);
|
int n = epoll_wait(s_epoll_fd, events, EPOLL_EVENTS, 10000);
|
||||||
if (n == -1) fprintf(stderr, "socket_run(): epoll_wait: %s\n", strerror(errno));
|
if (n == -1)
|
||||||
|
fprintf(stderr, "socket_run(): epoll_wait: %s\n", strerror(errno));
|
||||||
|
|
||||||
int i;
|
int i;
|
||||||
for (i = 0; i < n; i++)
|
for (i = 0; i < n; i++)
|
||||||
|
@ -221,8 +228,10 @@ void *socket_run(void *arg)
|
||||||
int fd = s_sockets.items[i]->fd;
|
int fd = s_sockets.items[i]->fd;
|
||||||
if (fd >= 0)
|
if (fd >= 0)
|
||||||
{
|
{
|
||||||
if (s_sockets.items[i]->mode & SM_READ ) FD_SET(fd, &read_fd);
|
if (s_sockets.items[i]->mode & SM_READ)
|
||||||
if (s_sockets.items[i]->mode & SM_WRITE) FD_SET(fd, &write_fd);
|
FD_SET(fd, &read_fd);
|
||||||
|
if (s_sockets.items[i]->mode & SM_WRITE)
|
||||||
|
FD_SET(fd, &write_fd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -235,7 +244,8 @@ void *socket_run(void *arg)
|
||||||
fprintf(stderr, "select: %s\n", strerror(errno));
|
fprintf(stderr, "select: %s\n", strerror(errno));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
if (n == 0) continue;
|
if (n == 0)
|
||||||
|
continue;
|
||||||
|
|
||||||
for (i = 0; i < s_sockets.used; i++)
|
for (i = 0; i < s_sockets.used; i++)
|
||||||
{
|
{
|
||||||
|
|
3
socket.h
3
socket.h
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
extern int s_running;
|
extern int s_running;
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
SM_READ = 1,
|
SM_READ = 1,
|
||||||
SM_WRITE = 2,
|
SM_WRITE = 2,
|
||||||
};
|
};
|
||||||
|
|
Binary file not shown.
After Width: | Height: | Size: 140 KiB |
26
text.c
26
text.c
|
@ -1,4 +1,4 @@
|
||||||
#include <GL/glfw.h>
|
#include <GLFW/glfw3.h>
|
||||||
#include <FTGL/ftgl.h>
|
#include <FTGL/ftgl.h>
|
||||||
#include "text.h"
|
#include "text.h"
|
||||||
|
|
||||||
|
@ -12,15 +12,27 @@ void drawText(const char *text, FTGLfont *font, float x, float y, float xs, floa
|
||||||
float ox = 0, oy = 0;
|
float ox = 0, oy = 0;
|
||||||
switch (xa)
|
switch (xa)
|
||||||
{
|
{
|
||||||
case TA_LEFT: ox = 0; break;
|
case TA_LEFT:
|
||||||
case TA_RIGHT: ox = -1; break;
|
ox = 0;
|
||||||
case TA_CENTRE: ox = -0.5; break;
|
break;
|
||||||
|
case TA_RIGHT:
|
||||||
|
ox = -1;
|
||||||
|
break;
|
||||||
|
case TA_CENTRE:
|
||||||
|
ox = -0.5;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
switch (ya)
|
switch (ya)
|
||||||
{
|
{
|
||||||
case TA_TOP: oy = -1; break;
|
case TA_TOP:
|
||||||
case TA_BOTTOM: oy = 0; break;
|
oy = -1;
|
||||||
case TA_CENTRE: oy = -0.5; break;
|
break;
|
||||||
|
case TA_BOTTOM:
|
||||||
|
oy = 0;
|
||||||
|
break;
|
||||||
|
case TA_CENTRE:
|
||||||
|
oy = -0.5;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
|
|
3
text.h
3
text.h
|
@ -3,7 +3,8 @@
|
||||||
|
|
||||||
#define TEXT_SIZE 64
|
#define TEXT_SIZE 64
|
||||||
|
|
||||||
enum {
|
enum
|
||||||
|
{
|
||||||
TA_LEFT,
|
TA_LEFT,
|
||||||
TA_RIGHT,
|
TA_RIGHT,
|
||||||
TA_TOP,
|
TA_TOP,
|
||||||
|
|
8
worker.c
8
worker.c
|
@ -38,7 +38,8 @@ void *worker_thread(void *arg)
|
||||||
if (s == -1)
|
if (s == -1)
|
||||||
{
|
{
|
||||||
worker->thread_timeout = true;
|
worker->thread_timeout = true;
|
||||||
if (errno == ETIMEDOUT) {
|
if (errno == ETIMEDOUT)
|
||||||
|
{
|
||||||
timeout = true;
|
timeout = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -50,7 +51,8 @@ void *worker_thread(void *arg)
|
||||||
if (queue_consume(worker->queue, &data))
|
if (queue_consume(worker->queue, &data))
|
||||||
{
|
{
|
||||||
/* Null item added to the queue indicate we should exit. */
|
/* Null item added to the queue indicate we should exit. */
|
||||||
if (data == NULL) break;
|
if (data == NULL)
|
||||||
|
break;
|
||||||
|
|
||||||
worker->callback(data);
|
worker->callback(data);
|
||||||
jobs++;
|
jobs++;
|
||||||
|
@ -129,5 +131,3 @@ void worker_queue(struct worker *worker, void *data)
|
||||||
fprintf(stderr, "Queue worker %s unable to queue\n", worker->name);
|
fprintf(stderr, "Queue worker %s unable to queue\n", worker->name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue