You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
209 lines
6.3 KiB
C
209 lines
6.3 KiB
C
7 months ago
|
/*
|
||
|
* Copyright (C) 2011 Justin Stoecker
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
#ifndef _ROBOVIZDRAW_H_
|
||
|
#define _ROBOVIZDRAW_H_
|
||
|
|
||
|
#include <string>
|
||
|
#include <cstdio>
|
||
|
#include <cstring>
|
||
|
|
||
|
using namespace std;
|
||
|
|
||
|
inline int writeCharToBuf(unsigned char* buf, unsigned char value) {
|
||
|
*buf = value;
|
||
|
return 1;
|
||
|
}
|
||
|
|
||
|
inline int writeFloatToBuf(unsigned char* buf, float value) {
|
||
|
char temp[20];
|
||
|
sprintf(temp, "%6f", value);
|
||
|
memcpy(buf, temp, 6);
|
||
|
return 6;
|
||
|
}
|
||
|
|
||
|
inline int writeColorToBuf(unsigned char* buf, const float* color, int channels) {
|
||
|
int i;
|
||
|
for (i = 0; i < channels; i++)
|
||
|
writeCharToBuf(buf + i, (unsigned char) (color[i]*255));
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
inline int writeStringToBuf(unsigned char* buf, const string* text) {
|
||
|
long i = 0;
|
||
|
if (text != NULL)
|
||
|
i += text->copy((char*) buf + i, text->length(), 0);
|
||
|
i += writeCharToBuf(buf + i, 0);
|
||
|
return i;
|
||
|
}
|
||
|
|
||
|
unsigned char* newBufferSwap(const string* name, int* bufSize) {
|
||
|
*bufSize = 3 + ((name != NULL) ? name->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 0);
|
||
|
i += writeCharToBuf(buf + i, 0);
|
||
|
i += writeStringToBuf(buf + i, name);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newCircle(const float* center, float radius, float thickness,
|
||
|
const float* color, const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 30 + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, 0);
|
||
|
i += writeFloatToBuf(buf + i, center[0]);
|
||
|
i += writeFloatToBuf(buf + i, center[1]);
|
||
|
i += writeFloatToBuf(buf + i, radius);
|
||
|
i += writeFloatToBuf(buf + i, thickness);
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newLine(const float* a, const float* b, float thickness,
|
||
|
const float* color, const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 48 + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeFloatToBuf(buf + i, a[0]);
|
||
|
i += writeFloatToBuf(buf + i, a[1]);
|
||
|
i += writeFloatToBuf(buf + i, a[2]);
|
||
|
i += writeFloatToBuf(buf + i, b[0]);
|
||
|
i += writeFloatToBuf(buf + i, b[1]);
|
||
|
i += writeFloatToBuf(buf + i, b[2]);
|
||
|
i += writeFloatToBuf(buf + i, thickness);
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newPoint(const float* p, float size, const float* color,
|
||
|
const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 30 + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, 2);
|
||
|
i += writeFloatToBuf(buf + i, p[0]);
|
||
|
i += writeFloatToBuf(buf + i, p[1]);
|
||
|
i += writeFloatToBuf(buf + i, p[2]);
|
||
|
i += writeFloatToBuf(buf + i, size);
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newSphere(const float* p, float radius, const float* color,
|
||
|
const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 30 + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, 3);
|
||
|
i += writeFloatToBuf(buf + i, p[0]);
|
||
|
i += writeFloatToBuf(buf + i, p[1]);
|
||
|
i += writeFloatToBuf(buf + i, p[2]);
|
||
|
i += writeFloatToBuf(buf + i, radius);
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newPolygon(const float* v, int numVerts, const float* color,
|
||
|
const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 18 * numVerts + 8 + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, 4);
|
||
|
i += writeCharToBuf(buf + i, numVerts);
|
||
|
i += writeColorToBuf(buf + i, color, 4);
|
||
|
|
||
|
for (int j = 0; j < numVerts; j++) {
|
||
|
i += writeFloatToBuf(buf + i, v[j * 3 + 0]);
|
||
|
i += writeFloatToBuf(buf + i, v[j * 3 + 1]);
|
||
|
i += writeFloatToBuf(buf + i, v[j * 3 + 2]);
|
||
|
}
|
||
|
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newAnnotation(const string* text, const float* p,
|
||
|
const float* color, const string* setName, int* bufSize) {
|
||
|
|
||
|
*bufSize = 25 + text->length() + ((setName != NULL) ? setName->length() : 0);
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 2);
|
||
|
i += writeCharToBuf(buf + i, 0);
|
||
|
i += writeFloatToBuf(buf + i, p[0]);
|
||
|
i += writeFloatToBuf(buf + i, p[1]);
|
||
|
i += writeFloatToBuf(buf + i, p[2]);
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, text);
|
||
|
i += writeStringToBuf(buf + i, setName);
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
unsigned char* newAgentAnnotation(const string* text, bool leftTeam,
|
||
|
int agentNum, const float* color, int* bufSize) {
|
||
|
|
||
|
*bufSize = (text == NULL) ? 3 : 7 + text->length();
|
||
|
unsigned char* buf = new unsigned char[*bufSize];
|
||
|
|
||
|
long i = 0;
|
||
|
i += writeCharToBuf(buf + i, 2);
|
||
|
|
||
|
if (text == NULL) {
|
||
|
i += writeCharToBuf(buf + i, 2);
|
||
|
i += writeCharToBuf(buf + i, (leftTeam ? agentNum - 1 : agentNum + 127));
|
||
|
} else {
|
||
|
i += writeCharToBuf(buf + i, 1);
|
||
|
i += writeCharToBuf(buf + i, (leftTeam ? agentNum - 1 : agentNum + 127));
|
||
|
i += writeColorToBuf(buf + i, color, 3);
|
||
|
i += writeStringToBuf(buf + i, text);
|
||
|
}
|
||
|
|
||
|
return buf;
|
||
|
}
|
||
|
|
||
|
#endif
|