Refactored drawing code into Drawing class.
This commit is contained in:
committed by
jason-watkins
parent
a3a82f4a71
commit
aa74bc57f5
277
xpcPlugin/Drawing.cpp
Normal file
277
xpcPlugin/Drawing.cpp
Normal file
@@ -0,0 +1,277 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#include "Drawing.h"
|
||||
#include "XPLMDisplay.h"
|
||||
#include "XPLMGraphics.h"
|
||||
#include "XPLMDataAccess.h"
|
||||
#include <math.h>
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
//OpenGL includes
|
||||
#if IBM
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#if __GNUC__
|
||||
#include <OpenGL/gl.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#endif
|
||||
|
||||
namespace XPC
|
||||
{
|
||||
//Internal Structures
|
||||
typedef struct
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
} LocalPoint;
|
||||
|
||||
//Internal Memory
|
||||
static const size_t MSG_MAX = 1024;
|
||||
static const size_t MSG_LINE_MAX = MSG_MAX / 16;
|
||||
static bool msgEnabled = false;
|
||||
static int msgX = -1;
|
||||
static int msgY = -1;
|
||||
static char msgVal[MSG_MAX] = { 0 };
|
||||
static size_t newLineCount = 0;
|
||||
static size_t newLines[MSG_LINE_MAX] = { 0 };
|
||||
static float rgb[3] = { 0.25F, 1.0F, 0.25F };
|
||||
|
||||
static const size_t WAYPOINT_MAX = 128;
|
||||
static bool routeEnabled = false;
|
||||
static size_t numWaypoints = 0;
|
||||
static Waypoint waypoints[WAYPOINT_MAX];
|
||||
static LocalPoint localPoints[WAYPOINT_MAX];
|
||||
|
||||
XPLMDataRef planeXref;
|
||||
XPLMDataRef planeYref;
|
||||
XPLMDataRef planeZref;
|
||||
|
||||
//Internal Functions
|
||||
static int cmp(const void * a, const void * b)
|
||||
{
|
||||
return (*(size_t*)a - *(size_t*)b);
|
||||
}
|
||||
|
||||
static void gl_drawCube(float x, float y, float z, float d)
|
||||
{
|
||||
//tan(0.25) degrees. Should scale all markers to appear about the same size
|
||||
const float TAN = 0.00436335082070156648652885284203;
|
||||
float h = d * TAN;
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
//Top
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
glVertex3f(x - h, y + h, z + h);
|
||||
glVertex3f(x + h, y + h, z + h);
|
||||
//Front
|
||||
glVertex3f(x - h, y - h, z + h);
|
||||
glVertex3f(x + h, y - h, z + h);
|
||||
//Bottom
|
||||
glVertex3f(x - h, y - h, z - h);
|
||||
glVertex3f(x + h, y - h, z - h);
|
||||
//Back
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
|
||||
glEnd();
|
||||
glBegin(GL_QUADS);
|
||||
//Left
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x - h, y + h, z + h);
|
||||
glVertex3f(x - h, y - h, z + h);
|
||||
glVertex3f(x - h, y - h, z - h);
|
||||
//Right
|
||||
glVertex3f(x + h, y + h, z + h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
glVertex3f(x + h, y - h, z - h);
|
||||
glVertex3f(x + h, y - h, z + h);
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static int MessageDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon)
|
||||
{
|
||||
XPLMDrawString(rgb, msgX, msgY, msgVal, NULL, xplmFont_Basic);
|
||||
int y = msgY - 16;
|
||||
for (size_t i = 0; i < newLineCount; ++i)
|
||||
{
|
||||
XPLMDrawString(rgb, msgX, y, msgVal + newLines[i], NULL, xplmFont_Basic);
|
||||
y -= 16;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int RouteDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon)
|
||||
{
|
||||
float px = XPLMGetDataf(planeXref);
|
||||
float py = XPLMGetDataf(planeYref);
|
||||
float pz = XPLMGetDataf(planeZref);
|
||||
|
||||
Waypoint* g;
|
||||
LocalPoint* l;
|
||||
//Convert to local
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
g = &waypoints[i];
|
||||
l = &localPoints[i];
|
||||
XPLMWorldToLocal(g->latitude, g->longitude, g->altitude,
|
||||
&l->x, &l->y, &l->z);
|
||||
}
|
||||
|
||||
|
||||
//Draw posts
|
||||
glColor3f(1.0F, 1.0F, 1.0F);
|
||||
glBegin(GL_LINES);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
glVertex3f((float)l->x, (float)l->y, (float)l->z);
|
||||
glVertex3f((float)l->x, -1000.0F, (float)l->z);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
//Draw route
|
||||
glColor3f(1.0F, 0.0F, 0.0F);
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
glVertex3f((float)l->x, (float)l->y, (float)l->z);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
//Draw markers
|
||||
glColor3f(1.0F, 1.0F, 1.0F);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
float xoff = (float)l->x - px;
|
||||
float yoff = (float)l->y - py;
|
||||
float zoff = (float)l->z - pz;
|
||||
float d = sqrtf(xoff*xoff + yoff*yoff + zoff*zoff);
|
||||
gl_drawCube((float)l->x, (float)l->y, (float)l->z, d);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Public Functions
|
||||
void Drawing::ClearMessage()
|
||||
{
|
||||
XPLMUnregisterDrawCallback(MessageDrawCallback, xplm_Phase_Window, 0, NULL);
|
||||
msgEnabled = false;
|
||||
}
|
||||
|
||||
void Drawing::SetMessage(int x, int y, char* msg)
|
||||
{
|
||||
//Determine size of message and clear instead if the message string
|
||||
//is empty.
|
||||
size_t len = strnlen(msg, MSG_MAX);
|
||||
if (len == 0)
|
||||
{
|
||||
ClearMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
//Set the message, location, and mark new lines.
|
||||
strncpy(msgVal, msg, len);
|
||||
newLineCount = 0;
|
||||
for (size_t i = 0; i < len && newLineCount < MSG_LINE_MAX; ++i)
|
||||
{
|
||||
if (msgVal[i] == '\n' || msgVal[i] == '\r')
|
||||
{
|
||||
msgVal[i] = 0;
|
||||
newLines[newLineCount++] = i + 1;
|
||||
}
|
||||
}
|
||||
msgX = x < 0 ? 10 : x;
|
||||
msgY = y < 0 ? 600 : y;
|
||||
|
||||
//Enable drawing if necessary
|
||||
if (!msgEnabled)
|
||||
{
|
||||
XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_LastCockpit, 0, NULL);
|
||||
msgEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
void Drawing::ClearWaypoints()
|
||||
{
|
||||
numWaypoints = 0;
|
||||
if (routeEnabled)
|
||||
{
|
||||
XPLMUnregisterDrawCallback(RouteDrawCallback, xplm_Phase_Objects, 0, NULL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void Drawing::AddWaypoints(Waypoint points[], size_t numPoints)
|
||||
{
|
||||
if (numWaypoints + numPoints > WAYPOINT_MAX)
|
||||
{
|
||||
numPoints = WAYPOINT_MAX - numWaypoints;
|
||||
}
|
||||
size_t finalNumWaypoints = numPoints + numWaypoints;
|
||||
for (size_t i = 0; i < numPoints; ++i)
|
||||
{
|
||||
waypoints[numWaypoints + i] = points[i];
|
||||
}
|
||||
numWaypoints = finalNumWaypoints;
|
||||
|
||||
if (!routeEnabled)
|
||||
{
|
||||
XPLMRegisterDrawCallback(RouteDrawCallback, xplm_Phase_Objects, 0, NULL);
|
||||
}
|
||||
if (!planeXref)
|
||||
{
|
||||
planeXref = XPLMFindDataRef("sim/flightmodel/position/local_x");
|
||||
planeYref = XPLMFindDataRef("sim/flightmodel/position/local_y");
|
||||
planeZref = XPLMFindDataRef("sim/flightmodel/position/local_z");
|
||||
}
|
||||
}
|
||||
|
||||
void Drawing::RemoveWaypoints(Waypoint points[], size_t numPoints)
|
||||
{
|
||||
//Build a list of indices of waypoints we should delete.
|
||||
size_t delPoints[WAYPOINT_MAX];
|
||||
size_t delPointsCur = 0;
|
||||
for (size_t i = 0; i < numPoints; ++i)
|
||||
{
|
||||
Waypoint p = points[i];
|
||||
for (size_t j = 0; j < numWaypoints; ++j)
|
||||
{
|
||||
Waypoint q = waypoints[j];
|
||||
if (p.latitude == q.latitude &&
|
||||
p.longitude == q.longitude &&
|
||||
p.altitude == q.altitude)
|
||||
{
|
||||
delPoints[delPointsCur++] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Sort the indices so that we only have to iterate them once
|
||||
qsort(delPoints, delPointsCur, sizeof(size_t), cmp);
|
||||
|
||||
//Copy the new array on top of the old array
|
||||
size_t copyCur = 0;
|
||||
size_t count = delPointsCur;
|
||||
delPointsCur = 0;
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
if (i == delPoints[delPointsCur])
|
||||
{
|
||||
++delPointsCur;
|
||||
continue;
|
||||
}
|
||||
waypoints[copyCur++] = waypoints[i];
|
||||
}
|
||||
numWaypoints -= count;
|
||||
if (numWaypoints == 0)
|
||||
{
|
||||
ClearWaypoints();
|
||||
}
|
||||
}
|
||||
}
|
||||
55
xpcPlugin/Drawing.h
Normal file
55
xpcPlugin/Drawing.h
Normal file
@@ -0,0 +1,55 @@
|
||||
//Copyright (c) 2013-2015 United States Government as represented by the Administrator of the
|
||||
//National Aeronautics and Space Administration. All Rights Reserved.
|
||||
#ifndef XPC_DRAWING_H
|
||||
#define XPC_DRAWING_H
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "xplaneConnect.h"
|
||||
|
||||
namespace XPC
|
||||
{
|
||||
/// Handles tasks that involve drawing to the screen in X-Plane.
|
||||
///
|
||||
/// \author Jason Watkins
|
||||
/// \version 1.0
|
||||
/// \since 1.0
|
||||
/// \date Intial Version: 2015-04-10
|
||||
/// \date Last Updated: 2015-04-10
|
||||
class Drawing
|
||||
{
|
||||
public:
|
||||
/// Clears the current message on the screen if any and unregisters the
|
||||
/// draw callback for message drawing.
|
||||
static void ClearMessage();
|
||||
|
||||
/// Sets the message to be drawn on the screen.
|
||||
///
|
||||
/// \param x The x coordinate of the message relative to the left edge
|
||||
/// of the screen.
|
||||
/// \param y The y coordinate of the message relative to the bottom
|
||||
/// edge of the screen
|
||||
/// \param msg A C string containing the message to display. The message
|
||||
/// value is copied into a local buffer.
|
||||
static void SetMessage(int x, int y, char* msg);
|
||||
|
||||
/// Adds the given waypoints to the list of waypoints to draw.
|
||||
///
|
||||
/// \param points A pointer to an array of waypoints.
|
||||
/// \param numPoints The number of points in the array.
|
||||
static void AddWaypoints(Waypoint points[], size_t numPoints);
|
||||
|
||||
/// Removes all waypoints and unregisters the callback for waypoint
|
||||
/// drawing.
|
||||
static void ClearWaypoints();
|
||||
|
||||
/// Removes the given waypoints from the list of waypoints to draw.
|
||||
/// If all waypoints are removed as a result of this action, unregisters
|
||||
/// the callback for waypoint drawing.
|
||||
///
|
||||
/// \param points A pointer to an array of waypoints.
|
||||
/// \param numPoints The number of points in the array.
|
||||
static void RemoveWaypoints(Waypoint points[], size_t numPoints);
|
||||
};
|
||||
}
|
||||
|
||||
#endif
|
||||
@@ -60,18 +60,21 @@
|
||||
|
||||
#define _WINSOCKAPI_
|
||||
|
||||
// XPC Includes
|
||||
#include "Log.h"
|
||||
#include "Drawing.h"
|
||||
#include "xpcPluginTools.h"
|
||||
|
||||
// XPLM Includes
|
||||
//#include "XPLMPlanes.h"
|
||||
#include "XPLMProcessing.h"
|
||||
#include "XPLMGraphics.h"
|
||||
|
||||
// System Includes
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
//#include "XPLMPlanes.h"
|
||||
#include "XPLMProcessing.h"
|
||||
#include "XPLMGraphics.h"
|
||||
#include "xpcDrawing.h"
|
||||
#include "xpcPluginTools.h"
|
||||
|
||||
#ifdef _WIN32 /* WIN32 SYSTEM */
|
||||
#include <windows.h>
|
||||
#elif (__APPLE__)
|
||||
@@ -191,10 +194,10 @@ PLUGIN_API void XPluginDisable(void)
|
||||
closeUDP(sendSocket);
|
||||
|
||||
// Stop rendering messages to screen.
|
||||
XPCClearMessage();
|
||||
XPC::Drawing::ClearMessage();
|
||||
|
||||
// Stop rendering waypoints to screen.
|
||||
XPCClearWaypoints();
|
||||
XPC::Drawing::ClearWaypoints();
|
||||
|
||||
XPC::Log::WriteLine("[EXEC] xpcPlugin Disabled, sockets closed");
|
||||
}
|
||||
@@ -498,7 +501,7 @@ int handleTEXT(char *buf, int len)
|
||||
size_t msgLen = (unsigned char)buf[13];
|
||||
if (msgLen == 0)
|
||||
{
|
||||
XPCClearMessage();
|
||||
XPC::Drawing::ClearMessage();
|
||||
XPC::Log::WriteLine("[TEXT] Text cleared");
|
||||
}
|
||||
else
|
||||
@@ -506,7 +509,7 @@ int handleTEXT(char *buf, int len)
|
||||
int x = *((int*)(buf + 5));
|
||||
int y = *((int*)(buf + 9));
|
||||
strncpy(msg, buf + 14, msgLen);
|
||||
XPCSetMessage(x, y, msg);
|
||||
XPC::Drawing::SetMessage(x, y, msg);
|
||||
XPC::Log::WriteLine("[TEXT] Text set");
|
||||
}
|
||||
return 0;
|
||||
@@ -837,13 +840,13 @@ int handleWYPT(char buf[], int len)
|
||||
switch (wypt.op)
|
||||
{
|
||||
case xpc_WYPT_ADD:
|
||||
XPCAddWaypoints(wypt.points, wypt.numPoints);
|
||||
XPC::Drawing::AddWaypoints(wypt.points, wypt.numPoints);
|
||||
break;
|
||||
case xpc_WYPT_DEL:
|
||||
XPCRemoveWaypoints(wypt.points, wypt.numPoints);
|
||||
XPC::Drawing::RemoveWaypoints(wypt.points, wypt.numPoints);
|
||||
break;
|
||||
case xpc_WYPT_CLR:
|
||||
XPCClearWaypoints();
|
||||
XPC::Drawing::ClearWaypoints();
|
||||
break;
|
||||
default: //If parseWYPT is doing its job, we shouldn't ever hit this.
|
||||
return -2;
|
||||
|
||||
Binary file not shown.
Binary file not shown.
@@ -1,268 +0,0 @@
|
||||
#include "xpcDrawing.h"
|
||||
#include "XPLMDisplay.h"
|
||||
#include "XPLMGraphics.h"
|
||||
#include "XPLMDataAccess.h"
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <math.h>
|
||||
//OpenGL includes
|
||||
#if IBM
|
||||
#include <windows.h>
|
||||
#endif
|
||||
#if __GNUC__
|
||||
#include <OpenGL/gl.h>
|
||||
#else
|
||||
#include <GL/gl.h>
|
||||
#endif
|
||||
|
||||
//Internal Structures
|
||||
typedef struct
|
||||
{
|
||||
double x;
|
||||
double y;
|
||||
double z;
|
||||
} LocalPoint;
|
||||
|
||||
//Internal Memory
|
||||
static const size_t MSG_MAX = 1024;
|
||||
static const size_t MSG_LINE_MAX = MSG_MAX / 16;
|
||||
static bool msgEnabled = false;
|
||||
static int msgX = -1;
|
||||
static int msgY = -1;
|
||||
static char msgVal[MSG_MAX] = { 0 };
|
||||
static size_t newLineCount = 0;
|
||||
static size_t newLines[MSG_LINE_MAX] = { 0 };
|
||||
static float rgb[3] = { 0.25F, 1.0F, 0.25F };
|
||||
|
||||
static const size_t WAYPOINT_MAX = 128;
|
||||
static bool routeEnabled = false;
|
||||
static size_t numWaypoints = 0;
|
||||
static Waypoint waypoints[WAYPOINT_MAX];
|
||||
static LocalPoint localPoints[WAYPOINT_MAX];
|
||||
|
||||
XPLMDataRef planeXref;
|
||||
XPLMDataRef planeYref;
|
||||
XPLMDataRef planeZref;
|
||||
|
||||
//Internal Functions
|
||||
int cmp(const void * a, const void * b)
|
||||
{
|
||||
return (*(size_t*)a - *(size_t*)b);
|
||||
}
|
||||
|
||||
static void gl_drawCube(float x, float y, float z, float d)
|
||||
{
|
||||
//tan(0.25) degrees. Should scale all markers to appear about the same size
|
||||
const float TAN = 0.00436335082070156648652885284203;
|
||||
float h = d * TAN;
|
||||
|
||||
glBegin(GL_QUAD_STRIP);
|
||||
//Top
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
glVertex3f(x - h, y + h, z + h);
|
||||
glVertex3f(x + h, y + h, z + h);
|
||||
//Front
|
||||
glVertex3f(x - h, y - h, z + h);
|
||||
glVertex3f(x + h, y - h, z + h);
|
||||
//Bottom
|
||||
glVertex3f(x - h, y - h, z - h);
|
||||
glVertex3f(x + h, y - h, z - h);
|
||||
//Back
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
|
||||
glEnd();
|
||||
glBegin(GL_QUADS);
|
||||
//Left
|
||||
glVertex3f(x - h, y + h, z - h);
|
||||
glVertex3f(x - h, y + h, z + h);
|
||||
glVertex3f(x - h, y - h, z + h);
|
||||
glVertex3f(x - h, y - h, z - h);
|
||||
//Right
|
||||
glVertex3f(x + h, y + h, z + h);
|
||||
glVertex3f(x + h, y + h, z - h);
|
||||
glVertex3f(x + h, y - h, z - h);
|
||||
glVertex3f(x + h, y - h, z + h);
|
||||
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static int MessageDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon)
|
||||
{
|
||||
XPLMDrawString(rgb, msgX, msgY, msgVal, NULL, xplmFont_Basic);
|
||||
int y = msgY - 16;
|
||||
for (size_t i = 0; i < newLineCount; ++i)
|
||||
{
|
||||
XPLMDrawString(rgb, msgX, y, msgVal + newLines[i], NULL, xplmFont_Basic);
|
||||
y -= 16;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int RouteDrawCallback(XPLMDrawingPhase inPhase, int inIsBefore, void * inRefcon)
|
||||
{
|
||||
float px = XPLMGetDataf(planeXref);
|
||||
float py = XPLMGetDataf(planeYref);
|
||||
float pz = XPLMGetDataf(planeZref);
|
||||
|
||||
Waypoint* g;
|
||||
LocalPoint* l;
|
||||
//Convert to local
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
g = &waypoints[i];
|
||||
l = &localPoints[i];
|
||||
XPLMWorldToLocal(g->latitude, g->longitude, g->altitude,
|
||||
&l->x, &l->y, &l->z);
|
||||
}
|
||||
|
||||
|
||||
//Draw posts
|
||||
glColor3f(1.0F, 1.0F, 1.0F);
|
||||
glBegin(GL_LINES);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
glVertex3f((float)l->x, (float)l->y, (float)l->z);
|
||||
glVertex3f((float)l->x, -1000.0F, (float)l->z);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
//Draw route
|
||||
glColor3f(1.0F, 0.0F, 0.0F);
|
||||
glBegin(GL_LINE_STRIP);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
glVertex3f((float)l->x, (float)l->y, (float)l->z);
|
||||
}
|
||||
glEnd();
|
||||
|
||||
//Draw markers
|
||||
glColor3f(1.0F, 1.0F, 1.0F);
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
l = &localPoints[i];
|
||||
float xoff = (float)l->x - px;
|
||||
float yoff = (float)l->y - py;
|
||||
float zoff = (float)l->z - pz;
|
||||
float d = sqrtf(xoff*xoff + yoff*yoff + zoff*zoff);
|
||||
gl_drawCube((float)l->x, (float)l->y, (float)l->z, d);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
//Public Functions
|
||||
void XPCClearMessage()
|
||||
{
|
||||
XPLMUnregisterDrawCallback(MessageDrawCallback, xplm_Phase_Window, 0, NULL);
|
||||
msgEnabled = false;
|
||||
}
|
||||
|
||||
void XPCSetMessage(int x, int y, char* msg)
|
||||
{
|
||||
//Determine size of message and clear instead if the message string
|
||||
//is empty.
|
||||
size_t len = strnlen(msg, MSG_MAX);
|
||||
if (len == 0)
|
||||
{
|
||||
XPCClearMessage();
|
||||
return;
|
||||
}
|
||||
|
||||
//Set the message, location, and mark new lines.
|
||||
strncpy(msgVal, msg, len);
|
||||
newLineCount = 0;
|
||||
for (size_t i = 0; i < len && newLineCount < MSG_LINE_MAX; ++i)
|
||||
{
|
||||
if (msgVal[i] == '\n' || msgVal[i] == '\r')
|
||||
{
|
||||
msgVal[i] = 0;
|
||||
newLines[newLineCount++] = i + 1;
|
||||
}
|
||||
}
|
||||
msgX = x < 0 ? 10 : x;
|
||||
msgY = y < 0 ? 600 : y;
|
||||
|
||||
//Enable drawing if necessary
|
||||
if (!msgEnabled)
|
||||
{
|
||||
XPLMRegisterDrawCallback(MessageDrawCallback, xplm_Phase_LastCockpit, 0, NULL);
|
||||
msgEnabled = true;
|
||||
}
|
||||
}
|
||||
|
||||
void XPCClearWaypoints()
|
||||
{
|
||||
numWaypoints = 0;
|
||||
if (routeEnabled)
|
||||
{
|
||||
XPLMUnregisterDrawCallback(RouteDrawCallback, xplm_Phase_Objects, 0, NULL);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
void XPCAddWaypoints(Waypoint points[], size_t numPoints)
|
||||
{
|
||||
if (numWaypoints + numPoints > WAYPOINT_MAX)
|
||||
{
|
||||
numPoints = WAYPOINT_MAX - numWaypoints;
|
||||
}
|
||||
size_t finalNumWaypoints = numPoints + numWaypoints;
|
||||
for (size_t i = 0; i < numPoints; ++i)
|
||||
{
|
||||
waypoints[numWaypoints + i] = points[i];
|
||||
}
|
||||
numWaypoints = finalNumWaypoints;
|
||||
|
||||
if (!routeEnabled)
|
||||
{
|
||||
XPLMRegisterDrawCallback(RouteDrawCallback, xplm_Phase_Objects, 0, NULL);
|
||||
}
|
||||
if (!planeXref)
|
||||
{
|
||||
planeXref = XPLMFindDataRef("sim/flightmodel/position/local_x");
|
||||
planeYref = XPLMFindDataRef("sim/flightmodel/position/local_y");
|
||||
planeZref = XPLMFindDataRef("sim/flightmodel/position/local_z");
|
||||
}
|
||||
}
|
||||
|
||||
void XPCRemoveWaypoints(Waypoint points[], size_t numPoints)
|
||||
{
|
||||
//Build a list of indices of waypoints we should delete.
|
||||
size_t delPoints[WAYPOINT_MAX];
|
||||
size_t delPointsCur = 0;
|
||||
for (size_t i = 0; i < numPoints; ++i)
|
||||
{
|
||||
Waypoint p = points[i];
|
||||
for (size_t j = 0; j < numWaypoints; ++j)
|
||||
{
|
||||
Waypoint q = waypoints[j];
|
||||
if (p.latitude == q.latitude &&
|
||||
p.longitude == q.longitude &&
|
||||
p.altitude == q.altitude)
|
||||
{
|
||||
delPoints[delPointsCur++] = j;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
//Sort the indices so that we only have to iterate them once
|
||||
qsort(delPoints, delPointsCur, sizeof(size_t), cmp);
|
||||
|
||||
//Copy the new array on top of the old array
|
||||
size_t copyCur = 0;
|
||||
size_t count = delPointsCur;
|
||||
delPointsCur = 0;
|
||||
for (size_t i = 0; i < numWaypoints; ++i)
|
||||
{
|
||||
if (i == delPoints[delPointsCur])
|
||||
{
|
||||
++delPointsCur;
|
||||
continue;
|
||||
}
|
||||
waypoints[copyCur++] = waypoints[i];
|
||||
}
|
||||
numWaypoints -= count;
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
#ifndef xpcDrawing_h
|
||||
#define xpcDrawing_h
|
||||
|
||||
#include <stdlib.h>
|
||||
#include "xplaneConnect.h"
|
||||
|
||||
void XPCClearMessage();
|
||||
|
||||
void XPCSetMessage(int x, int y, char* msg);
|
||||
|
||||
void XPCClearWaypoints();
|
||||
|
||||
void XPCAddWaypoints(Waypoint points[], size_t numPoints);
|
||||
|
||||
void XPCRemoveWaypoints(Waypoint points[], size_t numPoints);
|
||||
|
||||
#endif
|
||||
@@ -99,14 +99,14 @@
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="..\..\C\src\xplaneConnect.h" />
|
||||
<ClInclude Include="..\Drawing.h" />
|
||||
<ClInclude Include="..\Log.h" />
|
||||
<ClInclude Include="..\xpcDrawing.h" />
|
||||
<ClInclude Include="..\xpcPluginTools.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="..\..\C\src\xplaneConnect.c" />
|
||||
<ClCompile Include="..\Drawing.cpp" />
|
||||
<ClCompile Include="..\Log.cpp" />
|
||||
<ClCompile Include="..\xpcDrawing.cpp" />
|
||||
<ClCompile Include="..\XPCPlugin.cpp" />
|
||||
<ClCompile Include="..\xpcPluginTools.cpp" />
|
||||
</ItemGroup>
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
<ClInclude Include="..\xpcPluginTools.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\xpcDrawing.h">
|
||||
<ClInclude Include="..\Log.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\Log.h">
|
||||
<ClInclude Include="..\Drawing.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
@@ -38,10 +38,10 @@
|
||||
<ClCompile Include="..\xpcPluginTools.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\xpcDrawing.cpp">
|
||||
<ClCompile Include="..\Log.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\Log.cpp">
|
||||
<ClCompile Include="..\Drawing.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
|
||||
Reference in New Issue
Block a user