Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c3b9e23f3d | ||
|
|
87e94056cc | ||
|
|
c43718f8fa | ||
|
|
23f1ca4f34 | ||
|
|
e2f13cd311 | ||
|
|
ba9f15ee5c | ||
|
|
644437a5f0 | ||
|
|
353efb38c5 | ||
|
|
ae5a28f273 | ||
|
|
6f28527be4 | ||
|
|
f6f6889c63 | ||
|
|
638c507276 | ||
|
|
88685c6366 | ||
|
|
cc75cb631a | ||
|
|
9fccd71521 |
@@ -1,76 +0,0 @@
|
||||
#include "Button.h"
|
||||
#include <string>
|
||||
#include "Util.h"
|
||||
#include "Vector.h"
|
||||
#include "Cursor.h"
|
||||
|
||||
Button::Button(const std::string & text, Vec2f position, float width, float height) : Text(text,position)
|
||||
{
|
||||
this->width = width;
|
||||
this->height = height;
|
||||
this->planePosition = position;
|
||||
|
||||
cursorOnButton = false;
|
||||
alfa = 0.5f;
|
||||
background = Vec3f(10, 10, 10);
|
||||
//foreground = Vec3f(255, 255, 255);
|
||||
this->setColor(Vec3f(255, 255, 255));
|
||||
|
||||
this->position.x += width / 2 - textWidth / 2;
|
||||
this->position.y += height / 2 - textHeight / 2;
|
||||
}
|
||||
|
||||
Button::~Button()
|
||||
{
|
||||
/*if (action != nullptr)
|
||||
delete action;*/
|
||||
}
|
||||
|
||||
void Button::draw(void)
|
||||
{
|
||||
|
||||
glColor4f(background.x/255.0f, background.y / 255.0f, background.z / 255.0f, alfa);
|
||||
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(planePosition.x, planePosition.y);
|
||||
glVertex2f(planePosition.x, planePosition.y + height);
|
||||
glVertex2f(planePosition.x + width, planePosition.y + height);
|
||||
glVertex2f(planePosition.x + width, planePosition.y);
|
||||
glEnd();
|
||||
|
||||
/*glColor4f(foreground.x / 255.0f, foreground.y / 255.0f, foreground.z / 255.0f, 1.0f);
|
||||
Util::glutBitmapString(text, position.x, position.y+height/2+14/2);*/
|
||||
Text::draw();
|
||||
}
|
||||
|
||||
void Button::update(int x, int y)
|
||||
{
|
||||
cursorOnButton =
|
||||
(x > planePosition.x && x < planePosition.x + width) &&
|
||||
y > planePosition.y && y < planePosition.y + height;
|
||||
|
||||
|
||||
if (cursorOnButton)
|
||||
alfa = 1.0f;
|
||||
else
|
||||
alfa = 0.5f;
|
||||
|
||||
if (cursorOnButton && Cursor::getInstance()->clicked)
|
||||
if(action != nullptr)
|
||||
action(this);
|
||||
}
|
||||
|
||||
void Button::addAction(action_function action)
|
||||
{
|
||||
this->action = action;
|
||||
}
|
||||
|
||||
void Button::setForeground(Vec3f color)
|
||||
{
|
||||
this->setColor(color);
|
||||
}
|
||||
|
||||
void Button::setBackground(Vec3f color)
|
||||
{
|
||||
background = color;
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
#pragma once
|
||||
#include "Text.h"
|
||||
|
||||
|
||||
|
||||
class Button : public Text
|
||||
{
|
||||
private:
|
||||
typedef void(*action_function)(Button* b);
|
||||
float width, height;
|
||||
Vec3f background;
|
||||
Vec2f planePosition;
|
||||
bool cursorOnButton;
|
||||
float alfa;
|
||||
action_function action = nullptr;
|
||||
public:
|
||||
Button(const std::string &text, Vec2f position, float width, float height);
|
||||
~Button();
|
||||
|
||||
|
||||
|
||||
void draw();
|
||||
void update(int x, int y);
|
||||
|
||||
void addAction(action_function action);
|
||||
|
||||
void setForeground(Vec3f color);
|
||||
void setBackground(Vec3f color);
|
||||
};
|
||||
|
||||
@@ -1,17 +1,15 @@
|
||||
cmake_minimum_required(VERSION 3.5)
|
||||
project(CrystalPoint)
|
||||
|
||||
file(GLOB_RECURSE SOURCE_FILES
|
||||
file(GLOB SOURCE_FILES
|
||||
"*.h"
|
||||
"*.cpp"
|
||||
"*.cc"
|
||||
)
|
||||
|
||||
add_executable(CrystalPoint ${SOURCE_FILES})
|
||||
|
||||
find_package(OpenGL REQUIRED)
|
||||
find_package(GLUT REQUIRED)
|
||||
find_package(OpenAL REQUIRED)
|
||||
include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} ${OPENAL_INCLUDE_DIRS} )
|
||||
target_link_libraries(CrystalPoint ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} ${OPENAL_LIBRARY} )
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -lpthread")
|
||||
include_directories( ${OPENGL_INCLUDE_DIRS} ${GLUT_INCLUDE_DIRS} )
|
||||
target_link_libraries(CrystalPoint ${OPENGL_LIBRARIES} ${GLUT_LIBRARY} )
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall ")
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
//
|
||||
// Created by janco on 5/24/16.
|
||||
//
|
||||
|
||||
#include "Controller.h"
|
||||
|
||||
Controller::Controller(int controllerId) {
|
||||
this->controllerId = controllerId;
|
||||
this->ypr = Vec3f();
|
||||
this->joystick = Vec2f();
|
||||
this->setConnected(false);
|
||||
this->setConnected(true);
|
||||
}
|
||||
|
||||
Controller::~Controller() { }
|
||||
|
||||
void Controller::rumble(int duration, int power){
|
||||
// controllerhandler->rumble(controllerId, duration, power);
|
||||
}
|
||||
|
||||
void Controller::setConnected(bool connected) {
|
||||
if(connected){
|
||||
this->connected = true;
|
||||
}else{
|
||||
this->connected = false;
|
||||
this->ypr = Vec3f(0,0,0);
|
||||
this->joystick = Vec2f(0,0);
|
||||
this->button = false;
|
||||
this->magnetSwitch = false;
|
||||
this ->joystickButton = false;
|
||||
}
|
||||
}
|
||||
|
||||
bool Controller::isConnected(void) {
|
||||
return connected;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,20 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "Vector.h"
|
||||
|
||||
class Controller{
|
||||
public:
|
||||
Controller(int controllerId);
|
||||
~Controller();
|
||||
Vec3f ypr;
|
||||
Vec2f joystick;
|
||||
bool button, joystickButton, magnetSwitch;
|
||||
int controllerId;
|
||||
|
||||
void setConnected(bool connected);
|
||||
bool isConnected(void);
|
||||
|
||||
void rumble(int duration, int power);
|
||||
private:
|
||||
bool connected = false;
|
||||
};
|
||||
@@ -1,154 +0,0 @@
|
||||
//
|
||||
// Created by janco on 5/23/16.
|
||||
//
|
||||
|
||||
#include "ControllerHandler.h"
|
||||
#include <iostream>
|
||||
|
||||
/*
|
||||
* String split helper functions
|
||||
*/
|
||||
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems) {
|
||||
std::stringstream ss(s);
|
||||
std::string item;
|
||||
while (std::getline(ss, item, delim)) {
|
||||
elems.push_back(item);
|
||||
}
|
||||
return elems;
|
||||
}
|
||||
std::vector<std::string> split(const std::string &s, char delim) {
|
||||
std::vector<std::string> elems;
|
||||
split(s, delim, elems);
|
||||
return elems;
|
||||
}
|
||||
|
||||
ControllerHandler::ControllerHandler(){
|
||||
readthread = std::thread(&ControllerHandler::BasestationReader, this);
|
||||
};
|
||||
|
||||
Controller* ControllerHandler::getLeftController(void){
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if(controllers[i] != nullptr && controllers[i]->isConnected()){
|
||||
return controllers[i];
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Controller* ControllerHandler::getRightController(void){
|
||||
bool c1found = false;
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
if(controllers[i] != nullptr && controllers[i]->isConnected()){
|
||||
if(c1found){
|
||||
return controllers[i];
|
||||
}
|
||||
c1found = true;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void ControllerHandler::SearchBasestation(void){
|
||||
basestationFound = false;
|
||||
std::vector<serial::PortInfo> devices_found = serial::list_ports();
|
||||
std::vector<serial::PortInfo>::iterator iter = devices_found.begin();
|
||||
while( iter != devices_found.end() )
|
||||
{
|
||||
serial::PortInfo device = *iter++;
|
||||
if(device.hardware_id == "USB VID:PID=10c4:ea60 SNR=02133"){
|
||||
basestationFound = true;
|
||||
baseStation = new serial::Serial(device.port, BasestationBaudrate, serial::Timeout::simpleTimeout(1000));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ControllerHandler::rumble(int idController, int duration, int power){
|
||||
if (basestationFound)
|
||||
{
|
||||
char sendbuffer[16];
|
||||
sprintf(sendbuffer, "1|%01d|%06d|%03d\n", idController, duration, power);
|
||||
baseStation->write(sendbuffer);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Reading from basestation
|
||||
*/
|
||||
|
||||
void ControllerHandler::BasestationReader() {
|
||||
while(1){
|
||||
while(!basestationFound){
|
||||
SearchBasestation();
|
||||
if(basestationFound){
|
||||
baseStation ->write("stop\n");
|
||||
baseStation ->write("clientlist\n");
|
||||
}
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(2000));
|
||||
}
|
||||
while(baseStation->isOpen()){
|
||||
std::string basestationMessage = baseStation->readline();
|
||||
std::vector<std::string> basestationMessageSplit = split(basestationMessage, '|');
|
||||
if(basestationMessageSplit.size() > 1){ //Valid message
|
||||
std::cout << "DEBUG: Message received. Length: " << basestationMessageSplit.size() << " Type: " << basestationMessageSplit[0] << " Message: " << basestationMessage;
|
||||
int messageId = std::stoi(basestationMessageSplit[0]);
|
||||
switch(messageId){
|
||||
//commandList[messageId](basestationMessageSplit);
|
||||
case 0: commandDebug(basestationMessageSplit); break; //Debug message
|
||||
case 1: commandControllerData(basestationMessageSplit); break; //Data from controller
|
||||
case 2: commandControllerEvent(basestationMessageSplit); break; //Controller events
|
||||
case 3: commandControllerList(basestationMessageSplit); break; //Connected controller list
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ControllerHandler::commandDebug(std::vector<std::string> data) {
|
||||
std::cout << "DEBUG: " << data[1];
|
||||
}
|
||||
|
||||
void ControllerHandler::commandControllerData(std::vector<std::string> data) {
|
||||
if(data.size() == 10){
|
||||
Controller* c = controllers[std::stoi(data[1])];
|
||||
if(c != nullptr && c->isConnected()){
|
||||
c->ypr.x = std::stoi(data[5])/100.0f;
|
||||
c->ypr.y = std::stoi(data[6])/100.0f;
|
||||
c->ypr.z = std::stoi(data[7])/100.0f;
|
||||
|
||||
c->joystick.x = std::stoi(data[2])/2000.0f;
|
||||
c->joystick.y = std::stoi(data[3])/2000.0f;
|
||||
c->joystickButton = !(data[4] == "0");
|
||||
|
||||
c->magnetSwitch = !(data[9] == "0");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ControllerHandler::commandControllerEvent(std::vector<std::string> data) {
|
||||
if(data.size() == 3){
|
||||
if(data[1] == "connected"){
|
||||
int controllerId = std::stoi(data[2]);
|
||||
controllers[controllerId] = new Controller(controllerId);
|
||||
controllers[controllerId]->setConnected(true);
|
||||
}else if(data[1] == "disconnected"){
|
||||
// controllers.erase(*controllers[std::stoi(data[2])]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ControllerHandler::commandControllerList(std::vector<std::string> data) {
|
||||
for(unsigned int i = 1; i < data.size() - 1; i++){
|
||||
int controllerId = std::stoi(data[i]);
|
||||
controllers[controllerId] = new Controller(controllerId);
|
||||
rumble(controllerId, 100, 100);
|
||||
}
|
||||
if(basestationFound)
|
||||
baseStation->write("start\n");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
#pragma once
|
||||
//
|
||||
// Created by janco on 5/23/16.
|
||||
//
|
||||
|
||||
#define BasestationBaudrate 115200
|
||||
#include <thread>
|
||||
|
||||
#ifdef WIN32
|
||||
#include "include/serial.h"
|
||||
#else
|
||||
#include "lib/serial/include/serial.h"
|
||||
#endif
|
||||
|
||||
|
||||
#include "Controller.h"
|
||||
|
||||
class ControllerHandler{
|
||||
public:
|
||||
ControllerHandler();
|
||||
Controller* getLeftController(void);
|
||||
Controller* getRightController(void);
|
||||
void rumble(int idController, int duration, int power);
|
||||
private:
|
||||
void SearchBasestation(void);
|
||||
void BasestationReader(void);
|
||||
|
||||
bool basestationFound;
|
||||
serial::Serial *baseStation;
|
||||
std::thread readthread;
|
||||
Controller* controllers[4];
|
||||
|
||||
//Command functions
|
||||
void commandDebug(std::vector<std::string> data);
|
||||
void commandControllerData(std::vector<std::string> data);
|
||||
void commandControllerEvent(std::vector<std::string> data);
|
||||
void commandControllerList(std::vector<std::string> data);
|
||||
|
||||
//void(*commandList [1])(std::vector<std::string> data);
|
||||
};
|
||||
|
||||
@@ -1,57 +0,0 @@
|
||||
#include "Crystal.h"
|
||||
#include "Model.h"
|
||||
#include "Player.h"
|
||||
|
||||
|
||||
Crystal::Crystal(const std::string & filled, const std::string & empty, const Vec3f & position, Vec3f & rotation, const float & scale)
|
||||
{
|
||||
this->filled = Model::load(filled);
|
||||
this->empty = Model::load(empty);
|
||||
model = this->filled;
|
||||
|
||||
this->position = position;
|
||||
this->rotation = rotation;
|
||||
this->scale = scale;
|
||||
this->canCollide = true;
|
||||
isFilled = true;
|
||||
|
||||
sound_id = CrystalPoint::GetSoundSystem().LoadSound("WAVE/Crystal.wav", false);
|
||||
music = CrystalPoint::GetSoundSystem().GetSound(sound_id);
|
||||
music->SetPos(position, Vec3f());
|
||||
|
||||
crystalRot = 0;
|
||||
}
|
||||
|
||||
Crystal::~Crystal()
|
||||
{
|
||||
CrystalPoint::GetSoundSystem().UnloadSound(sound_id);
|
||||
if (model)
|
||||
Model::unload(model);
|
||||
|
||||
//if isfilled, means model is model filled, so model empty has to been deleted.
|
||||
//if is not filled, means model is model empty, so model filled has to been deleted.
|
||||
if (isFilled)
|
||||
if(empty)
|
||||
Model::unload(empty);
|
||||
else
|
||||
if(filled)
|
||||
Model::unload(filled);
|
||||
}
|
||||
|
||||
void Crystal::draw()
|
||||
{
|
||||
crystalRot -= 3.0f;
|
||||
rotation = Vec3f(0, crystalRot, 0);
|
||||
Entity::draw();
|
||||
}
|
||||
|
||||
void Crystal::collide()
|
||||
{
|
||||
if (isFilled)
|
||||
{
|
||||
music->Play();
|
||||
Player::getInstance()->crystals++;
|
||||
isFilled = false;
|
||||
model = empty;
|
||||
}
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
#pragma once
|
||||
#include "Entity.h"
|
||||
#include <string>
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
class Crystal :
|
||||
public Entity
|
||||
{
|
||||
public:
|
||||
Crystal(const std::string &filled, const std::string &empty,
|
||||
const Vec3f &position, Vec3f &rotation, const float &scale);
|
||||
~Crystal();
|
||||
float crystalRot;
|
||||
bool isFilled;
|
||||
void draw();
|
||||
void collide();
|
||||
private:
|
||||
int sound_id;
|
||||
Sound* music;
|
||||
Model* filled;
|
||||
Model* empty;
|
||||
};
|
||||
|
||||
@@ -5,31 +5,21 @@
|
||||
#include <cstring>
|
||||
#include "WorldHandler.h"
|
||||
#include "Player.h"
|
||||
#include "Cursor.h"
|
||||
#include "Menu.h"
|
||||
#include "Text.h"
|
||||
#include "Vector.h"
|
||||
#include "Button.h"
|
||||
|
||||
int CrystalPoint::width = 0;
|
||||
int CrystalPoint::height = 0;
|
||||
|
||||
SoundSystem CrystalPoint::sound_system;
|
||||
bool state = false;
|
||||
|
||||
void CrystalPoint::init()
|
||||
{
|
||||
player = Player::getInstance();
|
||||
worldhandler = WorldHandler::getInstance();
|
||||
cursor = Cursor::getInstance();
|
||||
|
||||
menu = new Menu();
|
||||
menuIsBuild = false;
|
||||
//cursor = Cursor::getInstance();
|
||||
|
||||
lastFrameTime = 0;
|
||||
state = true;
|
||||
|
||||
glClearColor(0.7f, 0.7f, 1.0f, 1.0f);
|
||||
glClearColor(0.7, 0.7, 1.0, 1.0);
|
||||
|
||||
mousePosition = Vec2f(width / 2, height / 2);
|
||||
}
|
||||
|
||||
|
||||
@@ -47,11 +37,9 @@ void CrystalPoint::draw()
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
|
||||
worldhandler->draw();
|
||||
|
||||
if(!state)
|
||||
menu->draw();
|
||||
//cursor->draw();
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
@@ -63,139 +51,46 @@ void CrystalPoint::update()
|
||||
float deltaTime = frameTime - lastFrameTime;
|
||||
lastFrameTime = frameTime;
|
||||
|
||||
if (keyboardState.keys[27] && !prevKeyboardState.keys[27])
|
||||
state = !state;
|
||||
if (keyboardState.special[GLUT_KEY_LEFT] && !prevKeyboardState.special[GLUT_KEY_LEFT])
|
||||
worldhandler->PreviousWorld();
|
||||
if (keyboardState.special[GLUT_KEY_RIGHT] && !prevKeyboardState.special[GLUT_KEY_RIGHT])
|
||||
worldhandler->NextWorld();
|
||||
if (keyboardState.keys[27])
|
||||
exit(0);
|
||||
|
||||
if (state)
|
||||
{
|
||||
Player* player = Player::getInstance();
|
||||
Player* player = Player::getInstance();
|
||||
|
||||
if (keyboardState.special[GLUT_KEY_LEFT] && !prevKeyboardState.special[GLUT_KEY_LEFT])
|
||||
worldhandler->PreviousWorld();
|
||||
if (keyboardState.special[GLUT_KEY_RIGHT] && !prevKeyboardState.special[GLUT_KEY_RIGHT])
|
||||
worldhandler->NextWorld();
|
||||
if (keyboardState.special[GLUT_KEY_UP] && !prevKeyboardState.special[GLUT_KEY_UP])
|
||||
player->NextLeftWeapon();
|
||||
if (keyboardState.special[GLUT_KEY_DOWN] && !prevKeyboardState.special[GLUT_KEY_DOWN])
|
||||
player->PreviousLeftWeapon();
|
||||
if (keyboardState.keys[27])
|
||||
state = false;
|
||||
player->rotation.y += mouseOffset.x / 10.0f;
|
||||
player->rotation.x += mouseOffset.y / 10.0f;
|
||||
if (player->rotation.x > 90)
|
||||
player->rotation.x = 90;
|
||||
if (player->rotation.x < -90)
|
||||
player->rotation.x = -90;
|
||||
|
||||
//testing code
|
||||
if (keyboardState.keys['u'])
|
||||
player->HpUp(1);
|
||||
if (keyboardState.keys['i'])
|
||||
player->HpDown(1);
|
||||
if (keyboardState.keys['o'])
|
||||
player->XpUp(1);
|
||||
float speed = 1;
|
||||
|
||||
player->rotation.y += mouseOffset.x / 10.0f;
|
||||
player->rotation.x += mouseOffset.y / 10.0f;
|
||||
Vec3f oldPosition = player->position;
|
||||
if (keyboardState.keys['a']) player->setPosition(0, deltaTime*speed, false);
|
||||
if (keyboardState.keys['d']) player->setPosition(180, deltaTime*speed, false);
|
||||
if (keyboardState.keys['w']) player->setPosition(90, deltaTime*speed, false);
|
||||
if (keyboardState.keys['s']) player->setPosition(270, deltaTime*speed, false);
|
||||
//if (keyboardState.keys['q']) player->setPosition(1, deltaTime*speed, true);
|
||||
//if (keyboardState.keys['e']) player->setPosition(-1, deltaTime*speed, true);
|
||||
|
||||
if (!worldhandler->isPlayerPositionValid())
|
||||
player->position = oldPosition;
|
||||
|
||||
player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 1.7f;
|
||||
|
||||
|
||||
float speed = 10;
|
||||
|
||||
Vec3f oldPosition = player->position;
|
||||
if (keyboardState.keys['a']) player->setPosition(0, deltaTime*speed, false);
|
||||
if (keyboardState.keys['d']) player->setPosition(180, deltaTime*speed, false);
|
||||
if (keyboardState.keys['w']) player->setPosition(90, deltaTime*speed, false);
|
||||
if (keyboardState.keys['s']) player->setPosition(270, deltaTime*speed, false);
|
||||
if (keyboardState.keys['q']) player->setPosition(1, deltaTime*speed, true);
|
||||
if (keyboardState.keys['e']) player->setPosition(-1, deltaTime*speed, true);
|
||||
|
||||
Controller *leftcontroller = controller.getLeftController();
|
||||
if (leftcontroller != nullptr) {
|
||||
Vec2f *leftControllerJoystick = &leftcontroller->joystick;
|
||||
|
||||
|
||||
if (leftcontroller->joystickButton) {
|
||||
controller.rumble(leftcontroller->controllerId, 100, 100);
|
||||
}
|
||||
|
||||
|
||||
if (leftControllerJoystick->y > 0.3) {
|
||||
player->setPosition(270, leftControllerJoystick->y * deltaTime * 2.0f, false);
|
||||
}
|
||||
else if (leftControllerJoystick->y < -0.3) {
|
||||
player->setPosition(90, leftControllerJoystick->y * -1 * deltaTime * 2.0f, false);
|
||||
}
|
||||
if (leftControllerJoystick->x > 0.3) {
|
||||
player->setPosition(180, leftControllerJoystick->x * deltaTime * 2.0f, false);
|
||||
}
|
||||
else if (leftControllerJoystick->x < -0.3) {
|
||||
player->setPosition(0, leftControllerJoystick->x * -1 * deltaTime * 2.0f, false);
|
||||
}
|
||||
|
||||
player->leftWeapon->rotateWeapon(Vec3f(leftcontroller->ypr.y + 140, 0, -leftcontroller->ypr.z));
|
||||
|
||||
}
|
||||
Controller *rightcontroller = controller.getRightController();
|
||||
if(rightcontroller != nullptr){
|
||||
Vec2f *rightControllerJoystick = &rightcontroller->joystick;
|
||||
if (rightControllerJoystick->y > 0.3 || rightControllerJoystick->y < -0.3) {
|
||||
player->rotation.x += rightcontroller->joystick.y/4;
|
||||
}
|
||||
|
||||
if (rightControllerJoystick->x > 0.3 || rightControllerJoystick->x < -0.3) {
|
||||
player->rotation.y += rightcontroller->joystick.x/4;
|
||||
}
|
||||
player->rightWeapon->rotateWeapon(Vec3f(rightcontroller->ypr.y + 140, 0, -rightcontroller->ypr.z));
|
||||
}
|
||||
|
||||
if (player->rotation.x > 90)
|
||||
player->rotation.x = 90;
|
||||
if (player->rotation.x < -90)
|
||||
player->rotation.x = -90;
|
||||
|
||||
player->position.y = worldhandler->getHeight(player->position.x, player->position.z) + 1.7f;
|
||||
|
||||
if (!worldhandler->isPlayerPositionValid())
|
||||
player->position = oldPosition;
|
||||
/*else if (player->position.y > oldPosition.y + 1.2)
|
||||
player->position = oldPosition;
|
||||
*/
|
||||
worldhandler->update(deltaTime);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!menuIsBuild)
|
||||
{
|
||||
buildMenu();
|
||||
menuIsBuild = true;
|
||||
}
|
||||
menu->update();
|
||||
cursor->update(cursor->mousePosition + mouseOffset);
|
||||
}
|
||||
worldhandler->update(deltaTime);
|
||||
|
||||
mousePosition = mousePosition + mouseOffset;
|
||||
//cursor->update(mousePosition);
|
||||
|
||||
mouseOffset = Vec2f(0, 0);
|
||||
prevKeyboardState = keyboardState;
|
||||
glutPostRedisplay();
|
||||
|
||||
sound_system.SetListener(player->position, Vec3f(), Vec3f());
|
||||
}
|
||||
|
||||
void CrystalPoint::buildMenu()
|
||||
{
|
||||
Button* start = new Button("Resume", Vec2f(width / 2 - 50, height / 2 - 30), 100, 50);
|
||||
auto toWorld = [](Button* b)
|
||||
{
|
||||
state = true;
|
||||
};
|
||||
start->addAction(toWorld);
|
||||
menu->AddMenuElement(start);
|
||||
|
||||
|
||||
Button* test = new Button("Exit", Vec2f(width / 2 - 50, height / 2 + 30), 100, 50);
|
||||
test->addAction([](Button* b)
|
||||
{
|
||||
exit(0);
|
||||
});
|
||||
menu->AddMenuElement(test);
|
||||
|
||||
Text* t = new Text("Pause", Vec2f(width / 2 - Util::glutTextWidth("Pause") / 2, height / 2 - 75));
|
||||
t->setColor(Vec3f(255, 255, 0));
|
||||
menu->AddMenuElement(t);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,13 +1,8 @@
|
||||
#pragma once
|
||||
|
||||
class WorldHandler;
|
||||
class SoundSystem;
|
||||
class Player;
|
||||
class Cursor;
|
||||
class Menu;
|
||||
#include "Vector.h"
|
||||
#include "SoundSystem.h"
|
||||
#include "ControllerHandler.h"
|
||||
|
||||
class KeyboardState
|
||||
{
|
||||
@@ -28,9 +23,6 @@ public:
|
||||
|
||||
WorldHandler* worldhandler;
|
||||
Player* player;
|
||||
ControllerHandler controller;
|
||||
Cursor* cursor;
|
||||
Menu* menu;
|
||||
|
||||
static int width, height;
|
||||
KeyboardState keyboardState;
|
||||
@@ -41,11 +33,4 @@ public:
|
||||
|
||||
float lastFrameTime;
|
||||
|
||||
static SoundSystem& GetSoundSystem() { return sound_system; }
|
||||
|
||||
bool menuIsBuild;
|
||||
|
||||
private:
|
||||
static SoundSystem sound_system;
|
||||
void buildMenu();
|
||||
};
|
||||
@@ -89,13 +89,12 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>lib/serial;freeglut/include; openAL/include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>freeglut/lib; openAL/libs/Win32</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>setupapi.lib;openal32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
@@ -105,13 +104,12 @@
|
||||
<Optimization>Disabled</Optimization>
|
||||
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>lib/serial;freeglut/include;C:\Program Files (x86)\OpenAL 1.1 SDK\include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>freeglut/lib;C:\Program Files (x86)\OpenAL 1.1 SDK\libs\Win32</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>setupapi.lib;openal32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||
@@ -123,15 +121,14 @@
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>lib/serial;freeglut/include; openAL/include</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>freeglut/lib; openAL/libs/Win32</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>setupapi.lib;openal32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
@@ -143,7 +140,7 @@
|
||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||
<PrecompiledHeaderFile />
|
||||
<AdditionalIncludeDirectories>lib/serial;freeglut/include;</AdditionalIncludeDirectories>
|
||||
<AdditionalIncludeDirectories>freeglut/include</AdditionalIncludeDirectories>
|
||||
</ClCompile>
|
||||
<Link>
|
||||
<SubSystem>Console</SubSystem>
|
||||
@@ -151,14 +148,9 @@
|
||||
<OptimizeReferences>true</OptimizeReferences>
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<AdditionalLibraryDirectories>freeglut/lib</AdditionalLibraryDirectories>
|
||||
<AdditionalDependencies>setupapi.lib;openal32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Button.cpp" />
|
||||
<ClCompile Include="Controller.cpp" />
|
||||
<ClCompile Include="ControllerHandler.cpp" />
|
||||
<ClCompile Include="Crystal.cpp" />
|
||||
<ClCompile Include="CrystalPoint.cpp" />
|
||||
<ClCompile Include="Cursor.cpp" />
|
||||
<ClCompile Include="Enemy.cpp" />
|
||||
@@ -167,32 +159,15 @@
|
||||
<ClCompile Include="Interface.cpp" />
|
||||
<ClCompile Include="json.cpp" />
|
||||
<ClCompile Include="LevelObject.cpp" />
|
||||
<ClCompile Include="lib\serial\src\impl\list_ports\list_ports_win.cc" />
|
||||
<ClCompile Include="lib\serial\src\impl\win.cc" />
|
||||
<ClCompile Include="lib\serial\src\serial.cc" />
|
||||
<ClCompile Include="LoadingScreen.cpp" />
|
||||
<ClCompile Include="Main.cpp" />
|
||||
<ClCompile Include="Menu.cpp" />
|
||||
<ClCompile Include="MenuElement.cpp" />
|
||||
<ClCompile Include="Model.cpp" />
|
||||
<ClCompile Include="Portal.cpp" />
|
||||
<ClCompile Include="Sound.cpp" />
|
||||
<ClCompile Include="SoundSystem.cpp" />
|
||||
<ClCompile Include="Player.cpp" />
|
||||
<ClCompile Include="Skybox.cpp" />
|
||||
<ClCompile Include="Text.cpp" />
|
||||
<ClCompile Include="Util.cpp" />
|
||||
<ClCompile Include="Vector.cpp" />
|
||||
<ClCompile Include="Vertex.cpp" />
|
||||
<ClCompile Include="Weapon.cpp" />
|
||||
<ClCompile Include="World.cpp" />
|
||||
<ClCompile Include="WorldHandler.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="Button.h" />
|
||||
<ClInclude Include="Controller.h" />
|
||||
<ClInclude Include="ControllerHandler.h" />
|
||||
<ClInclude Include="Crystal.h" />
|
||||
<ClInclude Include="CrystalPoint.h" />
|
||||
<ClInclude Include="Cursor.h" />
|
||||
<ClInclude Include="Enemy.h" />
|
||||
@@ -201,42 +176,22 @@
|
||||
<ClInclude Include="Interface.h" />
|
||||
<ClInclude Include="json.h" />
|
||||
<ClInclude Include="LevelObject.h" />
|
||||
<ClInclude Include="lib\serial\include\impl\win.h" />
|
||||
<ClInclude Include="lib\serial\include\serial.h" />
|
||||
<ClInclude Include="lib\serial\include\v8stdint.h" />
|
||||
<ClInclude Include="LoadingScreen.h" />
|
||||
<ClInclude Include="Main.h" />
|
||||
<ClInclude Include="Menu.h" />
|
||||
<ClInclude Include="MenuElement.h" />
|
||||
<ClInclude Include="Model.h" />
|
||||
<ClInclude Include="Portal.h" />
|
||||
<ClInclude Include="Sound.h" />
|
||||
<ClInclude Include="SoundSystem.h" />
|
||||
<ClInclude Include="Player.h" />
|
||||
<ClInclude Include="Skybox.h" />
|
||||
<ClInclude Include="stb_image.h" />
|
||||
<ClInclude Include="Text.h" />
|
||||
<ClInclude Include="Util.h" />
|
||||
<ClInclude Include="vector.h" />
|
||||
<ClInclude Include="Vertex.h" />
|
||||
<ClInclude Include="Weapon.h" />
|
||||
<ClInclude Include="World.h" />
|
||||
<ClInclude Include="WorldHandler.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="weapons.json" />
|
||||
<None Include="worlds\fire.json" />
|
||||
<None Include="worlds\ice.json" />
|
||||
<None Include="worlds\rock.json" />
|
||||
<None Include="worlds\small.json" />
|
||||
<None Include="worlds\worlds.json" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Media Include="WAVE\Crystal.wav" />
|
||||
<Media Include="WAVE\ghostEnemy.wav" />
|
||||
<Media Include="WAVE\portal.wav" />
|
||||
<Media Include="WAVE\world1.wav" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
||||
@@ -22,9 +22,6 @@
|
||||
<Filter Include="Source Files\json">
|
||||
<UniqueIdentifier>{9c655946-3f99-44ea-bc97-2817656954e0}</UniqueIdentifier>
|
||||
</Filter>
|
||||
<Filter Include="Source Files\Serial">
|
||||
<UniqueIdentifier>{98128574-9e08-4c28-9372-8d50b6e1a101}</UniqueIdentifier>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="Main.cpp">
|
||||
@@ -72,60 +69,6 @@
|
||||
<ClCompile Include="Interface.cpp">
|
||||
<Filter>Source Files\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Skybox.cpp">
|
||||
<Filter>Source Files\World</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Crystal.cpp">
|
||||
<Filter>Source Files\Object</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="SoundSystem.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Sound.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Crystal.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Portal.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Controller.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="ControllerHandler.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="lib\serial\src\impl\list_ports\list_ports_win.cc">
|
||||
<Filter>Source Files\Serial</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="lib\serial\src\impl\win.cc">
|
||||
<Filter>Source Files\Serial</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="lib\serial\src\serial.cc">
|
||||
<Filter>Source Files\Serial</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Weapon.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Button.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Menu.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="MenuElement.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Text.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="Util.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="LoadingScreen.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="World.h">
|
||||
@@ -176,57 +119,6 @@
|
||||
<ClInclude Include="vector.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="SoundSystem.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Sound.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Crystal.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Skybox.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Portal.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="ControllerHandler.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Controller.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="lib\serial\include\serial.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="lib\serial\include\v8stdint.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="lib\serial\include\impl\win.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Weapon.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Button.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Menu.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="MenuElement.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Text.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="Util.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="LoadingScreen.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="worlds\worlds.json">
|
||||
@@ -244,22 +136,5 @@
|
||||
<None Include="worlds\rock.json">
|
||||
<Filter>Source Files\json</Filter>
|
||||
</None>
|
||||
<None Include="weapons.json">
|
||||
<Filter>Source Files\json</Filter>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Media Include="WAVE\Crystal.wav">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Media>
|
||||
<Media Include="WAVE\portal.wav">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Media>
|
||||
<Media Include="WAVE\ghostEnemy.wav">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Media>
|
||||
<Media Include="WAVE\world1.wav">
|
||||
<Filter>Resource Files</Filter>
|
||||
</Media>
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
@@ -1,5 +1,5 @@
|
||||
#include "Cursor.h"
|
||||
#include <GL/freeglut.h>
|
||||
#include <GL\freeglut.h>
|
||||
#include <cmath>
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
@@ -8,13 +8,10 @@ Cursor* Cursor::instance = NULL;
|
||||
Cursor::Cursor()
|
||||
{
|
||||
enabled = false;
|
||||
mousePosition = Vec2f(CrystalPoint::width / 2, CrystalPoint::height / 2);
|
||||
clicked = false;
|
||||
}
|
||||
|
||||
Cursor::~Cursor()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
Cursor* Cursor::getInstance(void)
|
||||
@@ -57,24 +54,5 @@ void Cursor::draw(void)
|
||||
|
||||
void Cursor::update(Vec2f newPosition)
|
||||
{
|
||||
if (newPosition.x < 0)
|
||||
newPosition.x = 0;
|
||||
|
||||
if (newPosition.y < 0)
|
||||
newPosition.y = 0;
|
||||
|
||||
if (newPosition.x > CrystalPoint::width)
|
||||
newPosition.x = CrystalPoint::width;
|
||||
|
||||
if (newPosition.y > CrystalPoint::height)
|
||||
newPosition.y = CrystalPoint::height;
|
||||
|
||||
mousePosition = newPosition;
|
||||
|
||||
if (clicked)
|
||||
clicked = !clicked;
|
||||
if (state != prev)
|
||||
if(state == GLUT_UP)
|
||||
clicked = true;
|
||||
prev = state;
|
||||
}
|
||||
|
||||
@@ -8,9 +8,9 @@ private:
|
||||
|
||||
static Cursor* instance;
|
||||
bool enabled;
|
||||
|
||||
public:
|
||||
Vec2f mousePosition;
|
||||
public:
|
||||
|
||||
~Cursor();
|
||||
|
||||
static Cursor* getInstance(void);
|
||||
@@ -18,10 +18,6 @@ public:
|
||||
void enable(bool enable);
|
||||
bool isEnabled(void);
|
||||
|
||||
bool clicked;
|
||||
int state, prev;
|
||||
|
||||
|
||||
void draw(void);
|
||||
void update(Vec2f newPosition);
|
||||
};
|
||||
|
||||
@@ -1,15 +1,14 @@
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <cmath>
|
||||
|
||||
#include "Enemy.h"
|
||||
#include "Model.h"
|
||||
#include <iostream>
|
||||
|
||||
|
||||
Enemy::Enemy(const std::string &fileName,
|
||||
const std::string &fileMusic,
|
||||
float damage,
|
||||
float health,
|
||||
const Vec3f &position,
|
||||
const Vec3f &rotation,
|
||||
Vec3f &rotation,
|
||||
const float &scale)
|
||||
{
|
||||
model = Model::load(fileName);
|
||||
@@ -19,23 +18,13 @@ Enemy::Enemy(const std::string &fileName,
|
||||
this->canCollide = true;
|
||||
target = position;
|
||||
speed = 1;
|
||||
radius = 10;
|
||||
|
||||
xp = health;
|
||||
this->health = health;
|
||||
this->damage = damage;
|
||||
|
||||
radius = 20;
|
||||
hasTarget = false;
|
||||
hit_sound_id = CrystalPoint::GetSoundSystem().LoadSound(fileMusic.c_str(), false);
|
||||
music = CrystalPoint::GetSoundSystem().GetSound(hit_sound_id);
|
||||
attack = false;
|
||||
}
|
||||
|
||||
|
||||
Enemy::~Enemy()
|
||||
{
|
||||
music->Stop();
|
||||
CrystalPoint::GetSoundSystem().UnloadSound(hit_sound_id);
|
||||
if (model)
|
||||
Model::unload(model);
|
||||
}
|
||||
@@ -43,39 +32,26 @@ Enemy::~Enemy()
|
||||
void Enemy::draw()
|
||||
{
|
||||
Entity::draw();
|
||||
}
|
||||
glPushMatrix();
|
||||
|
||||
void Enemy::inEyeSight(Vec3f & TargetPosition)
|
||||
{
|
||||
if (position.Distance(TargetPosition) <= radius)
|
||||
glTranslatef(position.x, position.y, position.z);
|
||||
|
||||
glBegin(GL_LINE_LOOP);
|
||||
for (int i = 0; i < 360; i++)
|
||||
{
|
||||
hasTarget = true;
|
||||
target = TargetPosition;
|
||||
//convert degrees into radians
|
||||
float degInRad = i*(M_PI / 180.0);
|
||||
glVertex3f(cos(degInRad)*radius, 1*scale,sin(degInRad)*radius);
|
||||
}
|
||||
else
|
||||
hasTarget = false;
|
||||
}
|
||||
glEnd();
|
||||
|
||||
void Enemy::collide(const Entity * entity)
|
||||
{
|
||||
Vec3f difference = position - entity->position; //zou misschien omgedraait moeten worden
|
||||
difference.y = 0;
|
||||
difference.Normalize();
|
||||
difference = difference * (entity->model->radius + 0.01f);
|
||||
position.x = difference.x + entity->position.x;
|
||||
position.z = difference.z + entity->position.z;
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
void Enemy::update(float delta)
|
||||
{
|
||||
music->SetPos(position, Vec3f());
|
||||
|
||||
if (hasTarget)
|
||||
{
|
||||
if (music->IsPlaying() == false)
|
||||
{
|
||||
music->Play();
|
||||
}
|
||||
//just 2d walking
|
||||
float dx, dz, length;
|
||||
|
||||
@@ -83,10 +59,8 @@ void Enemy::update(float delta)
|
||||
dz = target.z - position.z;
|
||||
|
||||
length = sqrt(dx*dx + dz*dz);
|
||||
if (length > 1)
|
||||
if (length > 0.03)
|
||||
{
|
||||
attack = false;
|
||||
|
||||
dx /= length;
|
||||
dz /= length;
|
||||
|
||||
@@ -96,10 +70,6 @@ void Enemy::update(float delta)
|
||||
position.x += dx;
|
||||
position.z += dz;
|
||||
}
|
||||
else
|
||||
{
|
||||
attack = true;
|
||||
}
|
||||
rotation.y = atan2f(dx, dz) * 180 / M_PI;
|
||||
}
|
||||
}
|
||||
@@ -3,30 +3,18 @@
|
||||
#include "Entity.h"
|
||||
#include <string>
|
||||
#include "Vector.h"
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
class Enemy : public Entity
|
||||
{
|
||||
public:
|
||||
Enemy(const std::string &fileName, const std::string &fileMusic, float damage, float health, const Vec3f &position, const Vec3f &rotation, const float &scale);
|
||||
Enemy(const std::string &fileName,const Vec3f &position,Vec3f &rotation,const float &scale);
|
||||
~Enemy();
|
||||
|
||||
Sound* music;
|
||||
|
||||
bool hasTarget;
|
||||
Vec3f target;
|
||||
float speed,radius;
|
||||
float health;
|
||||
float damage;
|
||||
int xp;
|
||||
bool attack;
|
||||
|
||||
void update(float);
|
||||
void draw();
|
||||
|
||||
void inEyeSight(Vec3f &);
|
||||
void collide(const Entity *entity);
|
||||
private:
|
||||
int hit_sound_id;
|
||||
};
|
||||
|
||||
|
||||
@@ -25,11 +25,13 @@ void Entity::draw()
|
||||
{
|
||||
glPushMatrix();
|
||||
|
||||
|
||||
glTranslatef(position.x, position.y, position.z);
|
||||
glRotatef(rotation.x, 1, 0, 0);
|
||||
glRotatef(rotation.y, 0, 1, 0);
|
||||
glRotatef(rotation.z, 0, 0, 1);
|
||||
glScalef(scale, scale, scale);
|
||||
//collision gaat hierdoor kapot glTranslatef(-model->center.x, 0, -model->center.z);
|
||||
|
||||
glEnable(GL_CULL_FACE);
|
||||
glCullFace(GL_BACK);
|
||||
|
||||
@@ -13,8 +13,6 @@ public:
|
||||
|
||||
virtual void draw();
|
||||
virtual void update(float elapsedTime) {};
|
||||
virtual void collide() {};
|
||||
|
||||
Vec3f position;
|
||||
Vec3f rotation;
|
||||
float scale;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#include "HeightMap.h"
|
||||
#include "stb_image.h"
|
||||
#include "Vector.h"
|
||||
#include "vector.h"
|
||||
|
||||
#include "LevelObject.h"
|
||||
|
||||
@@ -29,51 +29,29 @@ HeightMap::HeightMap(const std::string &file, World* world)
|
||||
return imgData[(x + y * width) * 4 + offset];
|
||||
};
|
||||
|
||||
std::vector<std::vector<Vec3f>> faceNormals(width-1, std::vector<Vec3f>(height-1, Vec3f(0,1,0)));
|
||||
for (int y = 0; y < height - 1; y++)
|
||||
{
|
||||
for (int x = 0; x < width - 1; x++)
|
||||
{
|
||||
int offsets[4][2] = { { 0, 0 },{ 1, 0 },{ 1, 1 },{ 0, 1 } };
|
||||
Vec3f ca(0, heightAt(x, y + 1) - heightAt(x, y), 1);
|
||||
Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0);
|
||||
Vec3f normal = ca.cross(ba);
|
||||
normal.Normalize();
|
||||
faceNormals[x][y] = normal;
|
||||
}
|
||||
}
|
||||
|
||||
for (int y = 0; y < height-1; y++)
|
||||
{
|
||||
for (int x = 0; x < width-1; x++)
|
||||
{
|
||||
int offsets[4][2] = { { 0, 0 },{ 1, 0 },{ 1, 1 },{ 0, 1 } };
|
||||
Vec3f ca(0, heightAt(x, y + 1) - heightAt(x, y), 1);
|
||||
Vec3f ba(1, heightAt(x + 1, y) - heightAt(x, y), 0);
|
||||
|
||||
if (valueAt(x, y, GREEN) > 5)
|
||||
|
||||
if (valueAt(x, y, GREEN) > 0)
|
||||
{
|
||||
world->addLevelObject(new LevelObject(world->getObjectFromValue(valueAt(x, y, GREEN)).first, Vec3f(x, heightAt(x, y), y), Vec3f(0, 0, 0), 1, world->getObjectFromValue(valueAt(x, y, GREEN)).second));
|
||||
}
|
||||
|
||||
Vec3f normal = ca.cross(ba);
|
||||
normal.Normalize();
|
||||
|
||||
for (int i = 0; i < 4; i++)
|
||||
{
|
||||
int xx = x + offsets[i][0];
|
||||
int yy = y + offsets[i][1];
|
||||
|
||||
Vec3f normal(0, 0, 0);
|
||||
if(xx < width-1 && yy < height-1)
|
||||
normal = normal + faceNormals[xx][yy];
|
||||
if(xx > 0 && yy < height-1)
|
||||
normal = normal + faceNormals[xx-1][yy];
|
||||
if (xx > 0 && yy > 0)
|
||||
normal = normal + faceNormals[xx-1][yy-1];
|
||||
if (yy > 0 && xx < width-1)
|
||||
normal = normal + faceNormals[xx][yy-1];
|
||||
normal.Normalize();
|
||||
|
||||
float h = heightAt(xx, yy);
|
||||
vertices.push_back(Vertex{ (float)(xx), h, (float)(yy),
|
||||
float h = heightAt(x + offsets[i][0], y + offsets[i][1]);
|
||||
vertices.push_back(Vertex{ (float)(x + offsets[i][0]), h, (float)(y + offsets[i][1]),
|
||||
normal.x, normal.y, normal.z,
|
||||
(xx) / (float)height, (yy) / (float)width } );
|
||||
(x + offsets[i][0]) / (float)height, (y + offsets[i][1]) / (float)width } );
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -150,17 +128,10 @@ float HeightMap::GetHeight(float x, float y)
|
||||
float labda3 = 1 - labda1 - labda2;
|
||||
|
||||
Vertex z = a * labda1 + b * labda2 + c * labda3;
|
||||
// Vertex z = (a * labda1) + (b * labda2) ;
|
||||
|
||||
return z.y;
|
||||
}
|
||||
|
||||
|
||||
int HeightMap::GetSize()
|
||||
{
|
||||
return height >= width ? height : width;
|
||||
}
|
||||
|
||||
void HeightMap::SetTexture(const std::string &file)
|
||||
{
|
||||
int bpp, width2, height2;
|
||||
|
||||
@@ -20,7 +20,6 @@ public:
|
||||
|
||||
void Draw();
|
||||
float GetHeight(float x, float y);
|
||||
int GetSize();
|
||||
void SetTexture(const std::string &file);
|
||||
|
||||
std::vector<Vertex> vertices;
|
||||
|
||||
@@ -1,26 +1,16 @@
|
||||
#include "Interface.h"
|
||||
#include <GL/freeglut.h>
|
||||
#include <GL\freeglut.h>
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "Player.h"
|
||||
#include "Util.h"
|
||||
|
||||
//Prototype
|
||||
void glutBitmapString(std::string str, int x, int y);
|
||||
|
||||
Interface::Interface()
|
||||
{
|
||||
crystalWidth = 20;
|
||||
crystalHeight = 50;
|
||||
crystalOffset = 5;
|
||||
maxCrystals = 0;
|
||||
}
|
||||
|
||||
Interface::Interface(int maxCrystal)
|
||||
{
|
||||
crystalWidth = 20;
|
||||
crystalHeight = 50;
|
||||
crystalOffset = 5;
|
||||
maxCrystals = maxCrystal;
|
||||
}
|
||||
|
||||
|
||||
@@ -60,8 +50,8 @@ void Interface::draw()
|
||||
glVertex2f(250, 965);
|
||||
|
||||
glColor4f(1.0f, 0.5f, 0.5f, 1.0);
|
||||
glVertex2f(250 + (player->health / player->maxHp * 500), 965);
|
||||
glVertex2f(250 + (player->health / player->maxHp * 500), 980);
|
||||
glVertex2f(250 + (player->health / 100 * 500), 965);
|
||||
glVertex2f(250 + (player->health / 100 * 500), 980);
|
||||
glEnd();
|
||||
|
||||
//XP bar
|
||||
@@ -79,45 +69,26 @@ void Interface::draw()
|
||||
glVertex2f(250, 935);
|
||||
|
||||
glColor4f(1.0f, 1.0f, 0.5f, 1.0);
|
||||
glVertex2f(250 + (player->xp / player->maxXp * 500), 935);
|
||||
glVertex2f(250 + (player->xp / player->maxXp * 500), 950);
|
||||
glVertex2f(250 + (player->xp / 100 * 500), 935);
|
||||
glVertex2f(250 + (player->xp / 100 * 500), 950);
|
||||
glEnd();
|
||||
|
||||
//Text: level
|
||||
glColor4f(1.0f, 1.0f, 0.1f, 1.0);
|
||||
Util::glutBitmapString("Level: " + std::to_string(player->level), 490, 900);
|
||||
glutBitmapString("Level: " + std::to_string(player->level), 490, 900);
|
||||
|
||||
//Text: weapons
|
||||
Util::glutBitmapString(player->leftWeapon->name, 850, 900);
|
||||
Util::glutBitmapString(player->rightWeapon->name, 10, 900);
|
||||
|
||||
for (int i = 0; i < maxCrystals; i++)
|
||||
{
|
||||
glBegin(GL_QUADS);
|
||||
|
||||
if(i < player->crystals)
|
||||
glColor4f(0, 1.0f, 1.0f, 1.0f);
|
||||
else
|
||||
glColor4f(0, 0.4f, 0.4f, 1.0f);
|
||||
|
||||
glVertex2f(975 - crystalWidth / 2 , crystalOffset*i + crystalHeight*i);
|
||||
glVertex2f(975 - crystalWidth , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
|
||||
|
||||
if (i < player->crystals)
|
||||
glColor4f(0, 0.7f, 0.7f, 1.0f);
|
||||
else
|
||||
glColor4f(0, 0.2f, 0.2f, 1.0f);
|
||||
|
||||
glVertex2f(975 - crystalWidth / 2 , crystalHeight + crystalOffset*i + crystalHeight*i);
|
||||
glVertex2f(975 , crystalHeight / 2 + crystalOffset*i + crystalHeight*i);
|
||||
glEnd();
|
||||
}
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
void Interface::update(float deltaTime)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void glutBitmapString(std::string str, int x, int y)
|
||||
{
|
||||
glRasterPos2f(x, y);
|
||||
for (int i = 0; i < str.size(); i++)
|
||||
{
|
||||
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
|
||||
}
|
||||
}
|
||||
@@ -3,13 +3,9 @@ class Interface
|
||||
{
|
||||
public:
|
||||
Interface();
|
||||
Interface(int);
|
||||
~Interface();
|
||||
|
||||
void draw(void);
|
||||
void update(float deltaTime);
|
||||
|
||||
int crystalWidth, crystalHeight, crystalOffset;
|
||||
int maxCrystals;
|
||||
};
|
||||
|
||||
|
||||
@@ -7,8 +7,6 @@ LevelObject::LevelObject(const std::string &fileName, const Vec3f &position, con
|
||||
{
|
||||
model = Model::load(fileName);
|
||||
this->position = position;
|
||||
this->position.x -= model->center.x;
|
||||
this->position.z -= model->center.z;
|
||||
this->rotation = rotation;
|
||||
this->scale = scale;
|
||||
this->canCollide = hasCollision;
|
||||
|
||||
@@ -1,71 +0,0 @@
|
||||
|
||||
#include "stb_image.h"
|
||||
#include "LoadingScreen.h"
|
||||
|
||||
#include "CrystalPoint.h"
|
||||
#include "Util.h"
|
||||
#include <ostream>
|
||||
|
||||
LoadingScreen::LoadingScreen()
|
||||
{
|
||||
points = 0;
|
||||
}
|
||||
|
||||
|
||||
LoadingScreen::~LoadingScreen()
|
||||
{
|
||||
}
|
||||
|
||||
void LoadingScreen::draw()
|
||||
{
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, CrystalPoint::width, CrystalPoint::height, 0, -10, 10);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
|
||||
|
||||
glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
glBindTexture(GL_TEXTURE_2D, textureId);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex2f(0, 0);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex2f(0, CrystalPoint::height);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex2f(CrystalPoint::width, CrystalPoint::height);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex2f(CrystalPoint::width, 0);
|
||||
glEnd();
|
||||
|
||||
/*glColor4f(1.0f, 1.0f, 0.0f, 1.0f);
|
||||
|
||||
std::ostringstream oss;
|
||||
|
||||
oss << loading << points << std::endl;
|
||||
|
||||
Util::glutBitmapString(oss.str(),
|
||||
CrystalPoint::width / 2 - Util::glutTextWidth(oss.str()),
|
||||
CrystalPoint::height / 2 - 7);*/
|
||||
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
void LoadingScreen::rise()
|
||||
{
|
||||
points++;
|
||||
draw();
|
||||
}
|
||||
|
||||
void LoadingScreen::setTexture(const std::string filename)
|
||||
{
|
||||
textureId = Util::loadTexture(filename);
|
||||
}
|
||||
@@ -1,22 +0,0 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <GL\freeglut.h>
|
||||
|
||||
class LoadingScreen
|
||||
{
|
||||
public:
|
||||
LoadingScreen();
|
||||
~LoadingScreen();
|
||||
|
||||
void draw();
|
||||
void rise();
|
||||
int points;
|
||||
|
||||
GLuint textureId;
|
||||
void setTexture(const std::string fileName);
|
||||
|
||||
private:
|
||||
const std::string loading = "Loaded: ";
|
||||
|
||||
};
|
||||
|
||||
@@ -4,11 +4,6 @@
|
||||
#include <stdio.h>
|
||||
#include "Vector.h"
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
|
||||
#include "Cursor.h"
|
||||
|
||||
void configureOpenGL(void);
|
||||
|
||||
CrystalPoint* app;
|
||||
@@ -55,23 +50,10 @@ int main(int argc, char* argv[])
|
||||
glutPassiveMotionFunc(mousemotion);
|
||||
glutMotionFunc(mousemotion);
|
||||
|
||||
auto mouseclick = [](int button, int state,
|
||||
int x, int y)
|
||||
{
|
||||
if (button == GLUT_LEFT_BUTTON)
|
||||
Cursor::getInstance()->state = state;
|
||||
|
||||
//std::cout << "Left button is down" << std::endl;
|
||||
};
|
||||
|
||||
glutMouseFunc(mouseclick);
|
||||
|
||||
CrystalPoint::height = GLUT_WINDOW_HEIGHT;
|
||||
CrystalPoint::width = GLUT_WINDOW_WIDTH;
|
||||
|
||||
glutMainLoop();
|
||||
|
||||
delete app;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -79,12 +61,9 @@ void configureOpenGL()
|
||||
{
|
||||
//Init window and glut display mode
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
|
||||
glutInitWindowSize(1440, 900);
|
||||
//glutInitWindowPosition((glutGet(GLUT_SCREEN_WIDTH) / 2) - (glutGet(GLUT_WINDOW_WIDTH) / 2), (glutGet(GLUT_SCREEN_HEIGHT) / 2) - (glutGet(GLUT_WINDOW_HEIGHT) / 2));
|
||||
|
||||
glutInitWindowSize(800, 600);
|
||||
glutCreateWindow("Crystal Point");
|
||||
//glutFullScreen();
|
||||
|
||||
glutFullScreen();
|
||||
|
||||
//Depth testing
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
@@ -112,7 +91,6 @@ void configureOpenGL()
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_LIGHT0);
|
||||
//glEnable(GL_COLOR_MATERIAL);
|
||||
|
||||
glutSetCursor(GLUT_CURSOR_NONE);
|
||||
}
|
||||
@@ -1,59 +0,0 @@
|
||||
#include <GL/freeglut.h>
|
||||
#include "Menu.h"
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
Menu::Menu()
|
||||
{
|
||||
cursor = Cursor::getInstance();
|
||||
}
|
||||
|
||||
|
||||
Menu::~Menu()
|
||||
{
|
||||
}
|
||||
|
||||
void Menu::draw(void)
|
||||
{
|
||||
//Switch view to Ortho
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
glOrtho(0, CrystalPoint::width, CrystalPoint::height, 0, -10, 10);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
|
||||
glColor4f(60/255.0f, 60/255.0f, 60/255.0f, 0.8f);
|
||||
glBegin(GL_QUADS);
|
||||
glVertex2f(0,0);
|
||||
glVertex2f(0, CrystalPoint::height);
|
||||
glVertex2f(CrystalPoint::width, CrystalPoint::height);
|
||||
glVertex2f(CrystalPoint::width, 0);
|
||||
glEnd();
|
||||
|
||||
|
||||
for (MenuElement* e : elements)
|
||||
{
|
||||
e->draw();
|
||||
}
|
||||
|
||||
cursor->draw();
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
}
|
||||
|
||||
void Menu::update()
|
||||
{
|
||||
for (MenuElement* e : elements)
|
||||
{
|
||||
e->update(cursor->mousePosition.x, cursor->mousePosition.y);
|
||||
}
|
||||
}
|
||||
|
||||
void Menu::AddMenuElement(MenuElement * e)
|
||||
{
|
||||
elements.push_back(e);
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
#pragma once
|
||||
#include <vector>
|
||||
#include "MenuElement.h"
|
||||
#include "Cursor.h"
|
||||
|
||||
class Menu
|
||||
{
|
||||
private:
|
||||
std::vector<MenuElement*> elements;
|
||||
Cursor* cursor;
|
||||
public:
|
||||
Menu();
|
||||
~Menu();
|
||||
|
||||
void draw(void);
|
||||
void update(void);
|
||||
|
||||
void AddMenuElement(MenuElement* e);
|
||||
};
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
#include "MenuElement.h"
|
||||
|
||||
MenuElement::MenuElement(Vec2f position)
|
||||
{
|
||||
hover = false;
|
||||
this->position = position;
|
||||
}
|
||||
|
||||
|
||||
MenuElement::~MenuElement()
|
||||
{
|
||||
}
|
||||
@@ -1,17 +0,0 @@
|
||||
#pragma once
|
||||
#include "Vector.h"
|
||||
#include <string>
|
||||
|
||||
class MenuElement
|
||||
{
|
||||
protected:
|
||||
bool hover;
|
||||
Vec2f position;
|
||||
public:
|
||||
MenuElement(Vec2f position);
|
||||
~MenuElement();
|
||||
|
||||
virtual void draw(void) {};
|
||||
virtual void update(int x, int y) {};
|
||||
};
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "Model.h"
|
||||
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include "stb_image.h"
|
||||
|
||||
#include <iostream>
|
||||
@@ -7,7 +8,6 @@
|
||||
#include <string>
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <cstring>
|
||||
|
||||
//Prototypes
|
||||
std::vector<std::string> split(std::string str, std::string sep);
|
||||
@@ -138,7 +138,7 @@ Model::Model(std::string fileName)
|
||||
radius = fmax(radius, (center.x - v.x) * (center.x - v.x) + (center.z - v.z) * (center.z - v.z));
|
||||
radius = sqrt(radius);
|
||||
|
||||
for (ObjGroup *group : groups)
|
||||
for each(ObjGroup *group in groups)
|
||||
{
|
||||
Optimise(group);
|
||||
}
|
||||
@@ -148,7 +148,7 @@ void Model::Optimise(ObjGroup *t)
|
||||
{
|
||||
for (Face &face : t->faces)
|
||||
{
|
||||
for (auto &vertex : face.vertices)
|
||||
for each(auto &vertex in face.vertices)
|
||||
{
|
||||
t->VertexArray.push_back(Vertex(vertices[vertex.position].x, vertices[vertex.position].y, vertices[vertex.position].z,
|
||||
normals[vertex.normal].x, normals[vertex.normal].y, normals[vertex.normal].z,
|
||||
@@ -370,7 +370,6 @@ void Model::unload(Model* model)
|
||||
{
|
||||
delete m.second.first;
|
||||
cache.erase(cache.find(m.first));
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -379,5 +378,8 @@ void Model::unload(Model* model)
|
||||
|
||||
Model::~Model(void)
|
||||
{
|
||||
|
||||
for (auto m : cache)
|
||||
{
|
||||
delete m.second.first;
|
||||
}
|
||||
}
|
||||
@@ -70,7 +70,7 @@ private:
|
||||
Model(std::string filename);
|
||||
~Model(void);
|
||||
|
||||
public:
|
||||
public:
|
||||
|
||||
static std::map<std::string, std::pair<Model*, int> > cache;
|
||||
static Model* load(const std::string &fileName);
|
||||
|
||||
@@ -3,31 +3,14 @@
|
||||
#include "Player.h"
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
|
||||
Player* Player::instance = NULL;
|
||||
|
||||
Player::Player()
|
||||
{
|
||||
speed = 10;
|
||||
maxHp = 100;
|
||||
health = maxHp;
|
||||
xp = 0;
|
||||
maxXp = 100;
|
||||
level = 1;
|
||||
crystals = 0;
|
||||
|
||||
loadWeapons();
|
||||
|
||||
currentleftweapon = 0;
|
||||
leftWeapon = leftweapons[0];
|
||||
leftWeapon->rotateWeapon(Vec3f(150, 0, 60));
|
||||
|
||||
currentrightweapon = 0;
|
||||
rightWeapon = rightweapons[0];
|
||||
rightWeapon->rotateWeapon(Vec3f(150, 0, 60));
|
||||
health = 50;
|
||||
xp = 75;
|
||||
level = 10;
|
||||
}
|
||||
|
||||
Player* Player::getInstance()
|
||||
@@ -58,13 +41,11 @@ void Player::setCamera()
|
||||
glRotatef(rotation.y, 0, 1, 0);
|
||||
glTranslatef(-position.x, -position.y, -position.z);
|
||||
|
||||
leftWeapon->rotate(rotation);
|
||||
rightWeapon->rotate(rotation);
|
||||
|
||||
}
|
||||
|
||||
void Player::setPosition(float angle, float fac, bool height)
|
||||
{
|
||||
fac *= speed;
|
||||
if (height)
|
||||
position.y += angle*fac;
|
||||
else
|
||||
@@ -72,150 +53,4 @@ void Player::setPosition(float angle, float fac, bool height)
|
||||
position.x -= (float)cos((rotation.y + angle) / 180 * M_PI) * fac;
|
||||
position.z -= (float)sin((rotation.y + angle) / 180 * M_PI) * fac;
|
||||
}
|
||||
|
||||
leftWeapon->move(position);
|
||||
rightWeapon->move(position);
|
||||
}
|
||||
|
||||
void Player::draw() {
|
||||
leftWeapon->draw();
|
||||
rightWeapon->draw();
|
||||
}
|
||||
|
||||
void Player::HpDown(int damage)
|
||||
{
|
||||
int newHealth = health - damage;
|
||||
if (newHealth <= 0)
|
||||
{
|
||||
exit(0);
|
||||
}
|
||||
health = newHealth;
|
||||
}
|
||||
|
||||
void Player::HpUp(int hp)
|
||||
{
|
||||
if (health != maxHp)
|
||||
{
|
||||
int newHealth = health + hp;
|
||||
if (newHealth >= maxHp)
|
||||
{
|
||||
newHealth = maxHp;
|
||||
}
|
||||
health = newHealth;
|
||||
}
|
||||
}
|
||||
|
||||
void Player::XpUp(int xpUp)
|
||||
{
|
||||
float newXp = xp + xpUp;
|
||||
if (newXp >= maxXp)
|
||||
{
|
||||
newXp -= maxXp;
|
||||
levelUp();
|
||||
}
|
||||
xp = newXp;
|
||||
}
|
||||
|
||||
|
||||
void Player::levelUp()
|
||||
{
|
||||
level++;
|
||||
maxXp += 50;
|
||||
maxHp += 10;
|
||||
health = maxHp;
|
||||
}
|
||||
|
||||
void Player::loadWeapons()
|
||||
{
|
||||
std::string fileName = "weapons.json";
|
||||
|
||||
//Open world json file
|
||||
std::ifstream file(fileName);
|
||||
if (!file.is_open())
|
||||
std::cout << "Error, can't open world file - " << fileName << "\n";
|
||||
|
||||
json::Value v = json::readJson(file);
|
||||
file.close();
|
||||
|
||||
//Check file
|
||||
if (v["weapons"].isNull())
|
||||
std::cout << "Invalid weapons file: " << fileName << "\n";
|
||||
|
||||
//Load object templates
|
||||
for (auto w : v["weapons"])
|
||||
{
|
||||
Weapon* lweapon;
|
||||
Weapon* rweapon;
|
||||
|
||||
std::string name = w["name"].asString();
|
||||
std::string fileN = w["file"].asString();
|
||||
float damage = w["damage"].asFloat();
|
||||
|
||||
Weapon::Element e = Weapon::FIRE;
|
||||
|
||||
if(w["element"].asString() == "fire")
|
||||
e = Weapon::FIRE;
|
||||
else if (w["element"].asString() == "water")
|
||||
e = Weapon::WATER;
|
||||
else if (w["element"].asString() == "earth")
|
||||
e = Weapon::EARTH;
|
||||
else if (w["element"].asString() == "air")
|
||||
e = Weapon::AIR;
|
||||
else
|
||||
e = Weapon::FIRE;
|
||||
|
||||
|
||||
Vec3f leftoffset = Vec3f(w["left"]["offset"][0].asFloat(), w["left"]["offset"][1].asFloat(), w["left"]["offset"][2].asFloat());
|
||||
Vec3f rightoffset = Vec3f(w["right"]["offset"][0].asFloat(), w["right"]["offset"][1].asFloat(), w["right"]["offset"][2].asFloat());
|
||||
|
||||
Vec3f anchor = Vec3f(w["anchor"][0].asFloat(), w["anchor"][1].asFloat(), w["anchor"][2].asFloat());
|
||||
Vec3f collision = Vec3f(w["collision"][0].asFloat(), w["collision"][1].asFloat(), w["collision"][2].asFloat());
|
||||
|
||||
Vec2f maxRot = Vec2f(w["maxRotation"][0].asFloat(), w["maxRotation"][1].asFloat());
|
||||
Vec2f minRot = Vec2f(w["minRotation"][0].asFloat(), w["minRotation"][1].asFloat());
|
||||
|
||||
lweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, leftoffset, anchor, maxRot, minRot, collision);
|
||||
rweapon = new Weapon(name, damage, e, fileN, 1, position, rotation, rightoffset, anchor, maxRot, minRot, collision);
|
||||
|
||||
leftweapons.push_back(lweapon);
|
||||
rightweapons.push_back(rweapon);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void Player::PreviousRightWeapon()
|
||||
{
|
||||
currentrightweapon--;
|
||||
|
||||
if (currentrightweapon < 0)
|
||||
currentrightweapon = (rightweapons.size() > level ? level - 1 : rightweapons.size() - 1);
|
||||
|
||||
rightWeapon = rightweapons[currentrightweapon];
|
||||
}
|
||||
void Player::NextRightWeapon(void)
|
||||
{
|
||||
currentrightweapon++;
|
||||
|
||||
if (currentrightweapon > level - 1 || currentrightweapon > rightweapons.size() - 1)
|
||||
currentrightweapon = 0;
|
||||
|
||||
rightWeapon = rightweapons[currentrightweapon];
|
||||
}
|
||||
void Player::PreviousLeftWeapon(void)
|
||||
{
|
||||
currentleftweapon--;
|
||||
|
||||
if (currentleftweapon < 0)
|
||||
currentleftweapon = (leftweapons.size() > level ? level - 1 : leftweapons.size() - 1);
|
||||
|
||||
leftWeapon = leftweapons[currentleftweapon];
|
||||
}
|
||||
void Player::NextLeftWeapon(void)
|
||||
{
|
||||
currentleftweapon++;
|
||||
|
||||
if (currentleftweapon > level - 1 || currentleftweapon > leftweapons.size() - 1)
|
||||
currentleftweapon = 0;
|
||||
|
||||
leftWeapon = leftweapons[currentleftweapon];
|
||||
}
|
||||
@@ -1,30 +1,18 @@
|
||||
#pragma once
|
||||
#include "Vector.h"
|
||||
#include "Weapon.h"
|
||||
#include "json.h"
|
||||
|
||||
#include <vector>
|
||||
class Model;
|
||||
|
||||
class Player
|
||||
{
|
||||
private:
|
||||
static Player* instance;
|
||||
void levelUp();
|
||||
|
||||
std::vector<Weapon*> leftweapons;
|
||||
std::vector<Weapon*> rightweapons;
|
||||
void loadWeapons(void);
|
||||
|
||||
int currentrightweapon;
|
||||
int currentleftweapon;
|
||||
|
||||
public:
|
||||
Player();
|
||||
~Player();
|
||||
|
||||
void setCamera();
|
||||
void setPosition(float angle, float fac, bool height);
|
||||
void draw(void);
|
||||
|
||||
static Player* getInstance(void);
|
||||
static void init(void);
|
||||
@@ -32,22 +20,12 @@ public:
|
||||
Vec3f position;
|
||||
Vec2f rotation;
|
||||
|
||||
Weapon* leftWeapon;
|
||||
Weapon* rightWeapon;
|
||||
Model* leftWeapon;
|
||||
Model* rightWeapon;
|
||||
|
||||
float health, maxHp;
|
||||
float xp, maxXp;
|
||||
float health;
|
||||
float xp;
|
||||
int level;
|
||||
int crystals;
|
||||
|
||||
float speed;
|
||||
|
||||
void HpUp(int);
|
||||
void HpDown(int);
|
||||
void XpUp(int);
|
||||
|
||||
void PreviousRightWeapon(void);
|
||||
void NextRightWeapon(void);
|
||||
void PreviousLeftWeapon(void);
|
||||
void NextLeftWeapon(void);
|
||||
};
|
||||
@@ -1,61 +0,0 @@
|
||||
#include "Portal.h"
|
||||
#include "Model.h"
|
||||
#include <iostream>
|
||||
#include "Player.h"
|
||||
#include "WorldHandler.h"
|
||||
|
||||
Portal::Portal(const std::string &fileName,
|
||||
const Vec3f &position,
|
||||
Vec3f &rotation,
|
||||
const float &scale)
|
||||
{
|
||||
model = Model::load(fileName);
|
||||
this->position = position;
|
||||
this->rotation = rotation;
|
||||
this->scale = scale;
|
||||
this->canCollide = true;
|
||||
|
||||
started = false;
|
||||
delay = 0;
|
||||
|
||||
sound_id = CrystalPoint::GetSoundSystem().LoadSound("WAVE/portal.wav", false);
|
||||
music = CrystalPoint::GetSoundSystem().GetSound(sound_id);
|
||||
music->SetPos(position, Vec3f());
|
||||
|
||||
mayEnter = false;
|
||||
maxCrystals = 0;
|
||||
}
|
||||
|
||||
|
||||
Portal::~Portal()
|
||||
{
|
||||
// Model::unload(model);
|
||||
CrystalPoint::GetSoundSystem().UnloadSound(sound_id);
|
||||
}
|
||||
|
||||
void Portal::collide()
|
||||
{
|
||||
if (maxCrystals == (Player::getInstance()->crystals) && !mayEnter)
|
||||
{
|
||||
canCollide = false;
|
||||
mayEnter = true;
|
||||
}
|
||||
}
|
||||
|
||||
bool Portal::enter(float deltaTime)
|
||||
{
|
||||
if (delay > 3 && started)
|
||||
{
|
||||
delay = 0;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (delay == 0 && !started)
|
||||
{
|
||||
music->Play();
|
||||
started = true;
|
||||
}
|
||||
|
||||
delay += deltaTime;
|
||||
return false;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
#pragma once
|
||||
#include "Entity.h"
|
||||
#include <string>
|
||||
#include "CrystalPoint.h"
|
||||
|
||||
class Portal :
|
||||
public Entity
|
||||
{
|
||||
public:
|
||||
Portal(const std::string &fileName,
|
||||
const Vec3f &position,
|
||||
Vec3f &rotation,
|
||||
const float &scale);
|
||||
~Portal();
|
||||
|
||||
bool enter(float deltaTime);
|
||||
|
||||
void collide();
|
||||
int maxCrystals;
|
||||
bool mayEnter;
|
||||
private:
|
||||
int sound_id;
|
||||
Sound* music;
|
||||
bool started;
|
||||
float delay;
|
||||
};
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
#include "cmath"
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
#include "Util.h"
|
||||
#include "stb_image.h"
|
||||
#include "Skybox.h"
|
||||
#include <string>
|
||||
#include <iostream>
|
||||
|
||||
enum{SKY_LEFT=0,SKY_BACK,SKY_RIGHT,SKY_FRONT,SKY_TOP,SKY_BOTTOM};
|
||||
GLuint skybox[6];
|
||||
|
||||
Skybox::Skybox(const float &size, const std::string &folder)
|
||||
{
|
||||
this->size = size;
|
||||
this->folder = folder;
|
||||
|
||||
brightness = 80;
|
||||
targetBrightness = 80;
|
||||
}
|
||||
|
||||
Skybox::~Skybox()
|
||||
{
|
||||
glDeleteTextures(6, &skybox[0]);
|
||||
}
|
||||
|
||||
void Skybox::init()
|
||||
{
|
||||
skybox[SKY_LEFT] = Util::loadTexture(folder + "left.png");
|
||||
skybox[SKY_BACK] = Util::loadTexture(folder + "back.png");
|
||||
skybox[SKY_RIGHT] = Util::loadTexture(folder + "right.png");
|
||||
skybox[SKY_FRONT] = Util::loadTexture(folder + "front.png");
|
||||
skybox[SKY_TOP] = Util::loadTexture(folder + "top.png");
|
||||
skybox[SKY_BOTTOM] = Util::loadTexture(folder + "bottom.png");
|
||||
}
|
||||
|
||||
void Skybox::draw()
|
||||
{
|
||||
glColor4f(brightness/255, brightness/255, brightness/255, 1);
|
||||
|
||||
bool b1 = glIsEnabled(GL_TEXTURE_2D);
|
||||
glDisable(GL_LIGHTING);
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
glEnable(GL_TEXTURE_2D);
|
||||
glDisable(GL_COLOR_MATERIAL);
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_BACK]);
|
||||
glBegin(GL_QUADS);
|
||||
glTexCoord2f(1,1);
|
||||
glVertex3f(size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(0,1);
|
||||
glVertex3f(-size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(0,0);
|
||||
glVertex3f(-size / 2, -size / 2, size / 2);
|
||||
glTexCoord2f(1,0);
|
||||
glVertex3f(size / 2, -size / 2, size / 2);
|
||||
glEnd();
|
||||
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_LEFT]);
|
||||
glBegin(GL_QUADS);
|
||||
//left face
|
||||
glTexCoord2f(1,1);
|
||||
glVertex3f(-size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(0,1);
|
||||
glVertex3f(-size / 2, size / 2, -size / 2);
|
||||
glTexCoord2f(0,0);
|
||||
glVertex3f(-size / 2, -size / 2, -size / 2);
|
||||
glTexCoord2f(1,0);
|
||||
glVertex3f(-size / 2, -size / 2, size / 2);
|
||||
glEnd();
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_FRONT]);
|
||||
glBegin(GL_QUADS);
|
||||
//front face
|
||||
glTexCoord2f(0, 1);
|
||||
glVertex3f(size / 2, size / 2, -size / 2);
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex3f(-size / 2, size / 2, -size / 2);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex3f(-size / 2, -size / 2, -size / 2);
|
||||
glTexCoord2f(0, 0);
|
||||
glVertex3f(size / 2, -size / 2, -size / 2);
|
||||
glEnd();
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_RIGHT]);
|
||||
glBegin(GL_QUADS);
|
||||
//right face
|
||||
glTexCoord2f(1, 1);
|
||||
glVertex3f(size / 2, size / 2, -size / 2);
|
||||
glTexCoord2f(0,1);
|
||||
glVertex3f(size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(0,0);
|
||||
glVertex3f(size / 2, -size / 2, size / 2);
|
||||
glTexCoord2f(1, 0);
|
||||
glVertex3f(size / 2, -size / 2, -size / 2);
|
||||
glEnd();
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_TOP]);
|
||||
glBegin(GL_QUADS); //top face
|
||||
glTexCoord2f(0,0);
|
||||
glVertex3f(size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(0,1);
|
||||
glVertex3f(-size / 2, size / 2, size / 2);
|
||||
glTexCoord2f(1,1);
|
||||
glVertex3f(-size / 2, size / 2, -size / 2);
|
||||
glTexCoord2f(1,0);
|
||||
glVertex3f(size / 2, size / 2, -size / 2);
|
||||
glEnd();
|
||||
glBindTexture(GL_TEXTURE_2D, skybox[SKY_BOTTOM]);
|
||||
glBegin(GL_QUADS);
|
||||
//bottom face
|
||||
glTexCoord2f(0,1);
|
||||
glVertex3f(size / 2, -size / 2, size / 2);
|
||||
glTexCoord2f(0,0);
|
||||
glVertex3f(-size / 2, -size / 2, size / 2);
|
||||
glTexCoord2f(1,0);
|
||||
glVertex3f(-size / 2, -size / 2, -size / 2);
|
||||
glTexCoord2f(1,1);
|
||||
glVertex3f(size / 2, -size / 2, -size / 2);
|
||||
glEnd();
|
||||
glEnable(GL_LIGHTING); //turn everything back, which we turned on, and turn everything off, which we have turned on.
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
if (!b1)
|
||||
glDisable(GL_TEXTURE_2D);
|
||||
}
|
||||
|
||||
void Skybox::update(float deltaTime, int curr, int max)
|
||||
{
|
||||
targetBrightness = 80 + ((255 - 80) / max) * curr;
|
||||
|
||||
if (targetBrightness > brightness + 2)
|
||||
{
|
||||
brightness += 20 * deltaTime;
|
||||
}
|
||||
|
||||
if (targetBrightness < brightness - 2)
|
||||
{
|
||||
brightness -= 20 * deltaTime;
|
||||
}
|
||||
}
|
||||
|
||||
GLuint Skybox::loadTexture(const std::string & fileName) //load the filename named texture
|
||||
{
|
||||
int width, height, bpp;
|
||||
|
||||
stbi_set_flip_vertically_on_load(true);
|
||||
unsigned char* imgData = stbi_load(fileName.c_str(), &width, &height, &bpp, 4);
|
||||
GLuint num;
|
||||
glGenTextures(1, &num);
|
||||
glBindTexture(GL_TEXTURE_2D, num);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D,
|
||||
0, //level
|
||||
GL_RGBA, //internal format
|
||||
width, //width
|
||||
height, //height
|
||||
0, //border
|
||||
GL_RGBA, //data format
|
||||
GL_UNSIGNED_BYTE, //data type
|
||||
imgData); //data
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
stbi_image_free(imgData);
|
||||
return num;
|
||||
}
|
||||
|
||||
@@ -1,21 +0,0 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
|
||||
class Skybox
|
||||
{
|
||||
private:
|
||||
float size;
|
||||
std::string folder;
|
||||
float brightness;
|
||||
float targetBrightness;
|
||||
public:
|
||||
Skybox(const float &size, const std::string &folder);
|
||||
~Skybox();
|
||||
|
||||
void init();
|
||||
void draw();
|
||||
|
||||
void update(float deltaTime, int, int);
|
||||
GLuint loadTexture(const std::string &fileName);
|
||||
|
||||
};
|
||||
@@ -1,167 +0,0 @@
|
||||
#include "Sound.h"
|
||||
|
||||
#include <iostream>
|
||||
#ifdef WIN32
|
||||
#include <windows.h>
|
||||
#include <al.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
typedef unsigned long DWORD;
|
||||
typedef unsigned short WORD;
|
||||
typedef unsigned int UNINT32;
|
||||
typedef unsigned char BYTE;
|
||||
#endif
|
||||
|
||||
|
||||
Sound::Sound(const char* inWavPath, bool inLooping):
|
||||
buffer_id(0),
|
||||
source_id(0),
|
||||
is_looping(inLooping)
|
||||
{
|
||||
const char* path = inWavPath;
|
||||
|
||||
FILE *fp = fopen(path, "rb"); // Open the WAVE file
|
||||
if (!fp)
|
||||
return; // Could not open file
|
||||
|
||||
// Check that the WAVE file is OK
|
||||
char type[4];
|
||||
fread(type, sizeof(char), 4, fp); // Reads the first bytes in the file
|
||||
if (type[0] != 'R' || type[1] != 'I' || type[2] != 'F' || type[3] != 'F') // Should be "RIFF"
|
||||
return; // Not RIFF
|
||||
|
||||
DWORD size;
|
||||
fread(&size, sizeof(DWORD), 1, fp); // Continue to read the file
|
||||
fread(type, sizeof(char), 4, fp); // Continue to read the file
|
||||
if (type[0] != 'W' || type[1] != 'A' || type[2] != 'V' || type[3] != 'E') // This part should be "WAVE"
|
||||
return; // Not WAVE
|
||||
|
||||
fread(type, sizeof(char), 4, fp); // Continue to read the file
|
||||
if (type[0] != 'f' || type[1] != 'm' || type[2] != 't' || type[3] != ' ') // This part should be "fmt "
|
||||
return; // Not fmt
|
||||
|
||||
// Now we know that the file is a acceptable WAVE file
|
||||
// Info about the WAVE data is now read and stored
|
||||
DWORD chunkSize;
|
||||
fread(&chunkSize, sizeof(DWORD), 1, fp);
|
||||
short formatType;
|
||||
fread(&formatType, sizeof(short), 1, fp);
|
||||
short channels;
|
||||
fread(&channels, sizeof(short), 1, fp);
|
||||
DWORD sampleRate;
|
||||
fread(&sampleRate, sizeof(DWORD), 1, fp);
|
||||
DWORD avgBytesPerSec;
|
||||
fread(&avgBytesPerSec, sizeof(DWORD), 1, fp);
|
||||
short bytesPerSample;
|
||||
fread(&bytesPerSample, sizeof(short), 1, fp);
|
||||
short bitsPerSample;
|
||||
fread(&bitsPerSample, sizeof(short), 1, fp);
|
||||
ALenum format = 0; // The audio format (bits per sample, number of channels)
|
||||
if (bitsPerSample == 8)
|
||||
{
|
||||
if (channels == 1)
|
||||
format = AL_FORMAT_MONO8;
|
||||
else if (channels == 2)
|
||||
format = AL_FORMAT_STEREO8;
|
||||
}
|
||||
else if (bitsPerSample == 16)
|
||||
{
|
||||
if (channels == 1)
|
||||
format = AL_FORMAT_MONO16;
|
||||
else if (channels == 2)
|
||||
format = AL_FORMAT_STEREO16;
|
||||
}
|
||||
if (!format)
|
||||
return; // Not valid format
|
||||
|
||||
fread(type, sizeof(char), 4, fp);
|
||||
if (type[0] != 'd' || type[1] != 'a' || type[2] != 't' || type[3] != 'a') // This part should be "data"
|
||||
return; // not data
|
||||
|
||||
DWORD dataSize;
|
||||
fread(&dataSize, sizeof(DWORD), 1, fp); // The size of the sound data is read
|
||||
|
||||
// Display the info about the WAVE file
|
||||
std::cout << "Chunk Size: " << chunkSize << "\n";
|
||||
std::cout << "Format Type: " << formatType << "\n";
|
||||
std::cout << "Channels: " << channels << "\n";
|
||||
std::cout << "Sample Rate: " << sampleRate << "\n";
|
||||
std::cout << "Average Bytes Per Second: " << avgBytesPerSec << "\n";
|
||||
std::cout << "Bytes Per Sample: " << bytesPerSample << "\n";
|
||||
std::cout << "Bits Per Sample: " << bitsPerSample << "\n";
|
||||
std::cout << "Data Size: " << dataSize << "\n";
|
||||
|
||||
unsigned char* buf = new unsigned char[dataSize]; // Allocate memory for the sound data
|
||||
std::cout << fread(buf, sizeof(BYTE), dataSize, fp) << " bytes loaded\n"; // Read the sound data and display the
|
||||
fclose(fp);
|
||||
|
||||
alGenBuffers(1, &buffer_id); // Generate one OpenAL Buffer and link to "buffer"
|
||||
alGenSources(1, &source_id); // Generate one OpenAL Source and link to "source"
|
||||
if (alGetError() != AL_NO_ERROR)
|
||||
return; // Error during buffer/source generation
|
||||
|
||||
alBufferData(buffer_id, format, buf, dataSize, sampleRate); // Store the sound data in the OpenAL Buffer
|
||||
if (alGetError() != AL_NO_ERROR)
|
||||
return; // Error during buffer loading
|
||||
|
||||
delete[] buf; // Delete the sound data buffer
|
||||
}
|
||||
|
||||
|
||||
Sound::~Sound()
|
||||
{
|
||||
alSourceStop(source_id);
|
||||
alDeleteSources(1, &source_id); // Delete the OpenAL Source
|
||||
alDeleteBuffers(1, &buffer_id); // Delete the OpenAL Buffer
|
||||
}
|
||||
|
||||
|
||||
void Sound::SetPos(const Vec3f& inPos, const Vec3f& inVel)
|
||||
{
|
||||
alSourcei(source_id, AL_BUFFER, buffer_id); // Link the buffer to the source
|
||||
alSourcef(source_id, AL_PITCH, 1.0f); // Set the pitch of the source
|
||||
alSourcef(source_id, AL_GAIN, 1.0f); // Set the gain of the source
|
||||
alSourcefv(source_id, AL_POSITION, inPos.v); // Set the position of the source
|
||||
alSourcefv(source_id, AL_VELOCITY, inVel.v); // Set the velocity of the source
|
||||
alSourcei(source_id, AL_LOOPING, is_looping ? AL_TRUE : AL_FALSE); // Set if source is looping sound
|
||||
}
|
||||
|
||||
|
||||
void Sound::Play()
|
||||
{
|
||||
alSourcePlay(source_id);
|
||||
int e = alGetError(); // != AL_NO_ERROR) return;
|
||||
}
|
||||
|
||||
|
||||
void Sound::Pause()
|
||||
{
|
||||
alSourcePause(source_id);
|
||||
}
|
||||
|
||||
|
||||
void Sound::Stop()
|
||||
{
|
||||
alSourceStop(source_id);
|
||||
}
|
||||
|
||||
bool Sound::IsPlaying()
|
||||
{
|
||||
ALenum state;
|
||||
|
||||
alGetSourcei(source_id, AL_SOURCE_STATE, &state);
|
||||
|
||||
return (state == AL_PLAYING);
|
||||
}
|
||||
|
||||
bool Sound::IsStopped()
|
||||
{
|
||||
ALenum state;
|
||||
|
||||
alGetSourcei(source_id, AL_SOURCE_STATE, &state);
|
||||
|
||||
std::cout << "MUSIC STATE: " << state << std::endl;
|
||||
|
||||
return (state == AL_STOPPED);
|
||||
}
|
||||
|
||||
@@ -1,24 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include "Vector.h"
|
||||
|
||||
class Sound
|
||||
{
|
||||
public:
|
||||
Sound(const char* inWavPath, bool inLooping);
|
||||
~Sound();
|
||||
|
||||
void SetPos(const Vec3f& inPos, const Vec3f& inVel);
|
||||
|
||||
void Play();
|
||||
void Pause();
|
||||
void Stop();
|
||||
bool IsPlaying();
|
||||
bool IsStopped();
|
||||
|
||||
private:
|
||||
unsigned int buffer_id;
|
||||
unsigned int source_id;
|
||||
|
||||
bool is_looping;
|
||||
};
|
||||
@@ -1,58 +0,0 @@
|
||||
#include "SoundSystem.h"
|
||||
|
||||
SoundSystem::SoundSystem():
|
||||
device(nullptr),
|
||||
context(nullptr)
|
||||
{
|
||||
device = alcOpenDevice(nullptr);
|
||||
if (!device)
|
||||
return;
|
||||
context = alcCreateContext(device, nullptr);
|
||||
if (!context)
|
||||
return;
|
||||
alcMakeContextCurrent(context);
|
||||
}
|
||||
|
||||
|
||||
SoundSystem::~SoundSystem()
|
||||
{
|
||||
for (auto sound : sounds)
|
||||
delete sound;
|
||||
alcMakeContextCurrent(nullptr);
|
||||
alcDestroyContext(context);
|
||||
alcCloseDevice(device);
|
||||
}
|
||||
|
||||
|
||||
void SoundSystem::SetListener(const Vec3f& inPos, const Vec3f& inVel, const Vec3f& inOri)
|
||||
{
|
||||
ALfloat orientation[] = { 0.0, 0.0, -1.0, 0.0, 1.0, 0.0 };
|
||||
|
||||
alListenerfv(AL_POSITION, inPos.v);
|
||||
alListenerfv(AL_VELOCITY, inVel.v);
|
||||
alListenerfv(AL_ORIENTATION, orientation);
|
||||
}
|
||||
|
||||
|
||||
unsigned int SoundSystem::LoadSound(const char* inWavPath, bool inLooping)
|
||||
{
|
||||
Sound* sound = new Sound(inWavPath, inLooping);
|
||||
sounds.push_back(sound);
|
||||
return sounds.size() - 1;
|
||||
}
|
||||
|
||||
|
||||
Sound* SoundSystem::GetSound(unsigned int inID)
|
||||
{
|
||||
if (inID > sounds.size())
|
||||
return nullptr;
|
||||
return sounds[inID];
|
||||
}
|
||||
|
||||
void SoundSystem::UnloadSound(unsigned int inID)
|
||||
{
|
||||
if (inID > sounds.size())
|
||||
return;
|
||||
delete sounds[inID];
|
||||
//sounds.erase(sounds.begin() + inID);
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#ifdef WIN32
|
||||
#include <al.h>
|
||||
#include <alc.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#endif
|
||||
|
||||
#include "Vector.h"
|
||||
#include "Sound.h"
|
||||
|
||||
|
||||
class SoundSystem
|
||||
{
|
||||
public:
|
||||
SoundSystem();
|
||||
~SoundSystem();
|
||||
|
||||
void SetListener(const Vec3f& inPos, const Vec3f& inVel, const Vec3f& inOri);
|
||||
|
||||
unsigned int LoadSound(const char* inWavPath, bool inLooping);
|
||||
Sound* GetSound(unsigned int inID);
|
||||
void UnloadSound(unsigned int inID);
|
||||
|
||||
private:
|
||||
ALCdevice* device;
|
||||
ALCcontext* context;
|
||||
std::vector<Sound*> sounds;
|
||||
};
|
||||
@@ -1,31 +0,0 @@
|
||||
#include "Text.h"
|
||||
|
||||
|
||||
Text::Text(const std::string &text, Vec2f position) : MenuElement(position)
|
||||
{
|
||||
this->text = text;
|
||||
color = Vec3f(50, 150, 150);
|
||||
textHeight = 14;
|
||||
textWidth = Util::glutTextWidth(text);
|
||||
}
|
||||
|
||||
|
||||
Text::~Text()
|
||||
{
|
||||
}
|
||||
|
||||
void Text::draw()
|
||||
{
|
||||
glColor4f(color.x/255.0f, color.y/255.0f, color.z/255.0f, 1.0f);
|
||||
Util::glutBitmapString(text, position.x-1, position.y+textHeight);
|
||||
}
|
||||
|
||||
void Text::update(int x, int y)
|
||||
{
|
||||
//Do nothing
|
||||
}
|
||||
|
||||
void Text::setColor(Vec3f color)
|
||||
{
|
||||
this->color = color;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
#pragma once
|
||||
#include "MenuElement.h"
|
||||
#include "Vector.h"
|
||||
#include "Util.h"
|
||||
|
||||
class Text : public MenuElement
|
||||
{
|
||||
private:
|
||||
std::string text;
|
||||
Vec3f color;
|
||||
protected:
|
||||
int textWidth;
|
||||
int textHeight;
|
||||
public:
|
||||
Text(const std::string &text, Vec2f position);
|
||||
~Text();
|
||||
|
||||
virtual void draw();
|
||||
virtual void update(int x, int y);
|
||||
|
||||
void setColor(Vec3f color);
|
||||
};
|
||||
|
||||
@@ -1,65 +0,0 @@
|
||||
#include "Util.h"
|
||||
#include "stb_image.h"
|
||||
|
||||
Util::Util()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
Util::~Util()
|
||||
{
|
||||
}
|
||||
|
||||
GLuint Util::loadTexture(const std::string &filename)
|
||||
{
|
||||
int width, height, bpp;
|
||||
|
||||
stbi_set_flip_vertically_on_load(true);
|
||||
unsigned char* imgData = stbi_load(filename.c_str(), &width, &height, &bpp, 4);
|
||||
GLuint num;
|
||||
glGenTextures(1, &num);
|
||||
glBindTexture(GL_TEXTURE_2D, num);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D,
|
||||
0, //level
|
||||
GL_RGBA, //internal format
|
||||
width, //width
|
||||
height, //height
|
||||
0, //border
|
||||
GL_RGBA, //data format
|
||||
GL_UNSIGNED_BYTE, //data type
|
||||
imgData); //data
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
stbi_image_free(imgData);
|
||||
return num;
|
||||
}
|
||||
|
||||
void Util::glutBitmapString(std::string str, int x, int y)
|
||||
{
|
||||
glRasterPos2f(x, y);
|
||||
for (int i = 0; i < str.size(); i++)
|
||||
{
|
||||
glutBitmapCharacter(GLUT_BITMAP_HELVETICA_18, str[i]);
|
||||
}
|
||||
}
|
||||
|
||||
int Util::glutTextWidth(const std::string str)
|
||||
{
|
||||
int total = 0;
|
||||
for (int i = 0; i < str.size(); i++)
|
||||
{
|
||||
total += glutBitmapWidth(GLUT_BITMAP_HELVETICA_18, str[i]);
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
//int Util::glutTextHeight()
|
||||
//{
|
||||
// return glutBitmapHeight(GLUT_BITMAP_HELVETICA_18);
|
||||
//}
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
#pragma once
|
||||
#include <string>
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
class Util
|
||||
{
|
||||
private:
|
||||
Util();
|
||||
~Util();
|
||||
public:
|
||||
static GLuint loadTexture(const std::string &filename);
|
||||
static void glutBitmapString(std::string str, int x, int y);
|
||||
static int glutTextWidth(const std::string str);
|
||||
//static int glutTextHeight();
|
||||
};
|
||||
|
||||
@@ -18,22 +18,22 @@ Vertex::~Vertex()
|
||||
{
|
||||
}
|
||||
|
||||
Vertex Vertex::operator/(const float &other) const
|
||||
Vertex Vertex::operator/(float &other)
|
||||
{
|
||||
return Vertex(x / other, y / other, z / other, normalX, normalY, normalZ, texX, texY);
|
||||
}
|
||||
|
||||
Vertex Vertex::operator*(const Vertex & other) const
|
||||
Vertex Vertex::operator*(Vertex & other)
|
||||
{
|
||||
return Vertex(x*other.x, y*other.y, z*other.z, normalX, normalY, normalZ, texX, texY);
|
||||
}
|
||||
|
||||
Vertex Vertex::operator*(const float & other) const
|
||||
Vertex Vertex::operator*(float & other)
|
||||
{
|
||||
return Vertex(x*other, y*other, z*other, normalX, normalY, normalZ, texX, texY);
|
||||
}
|
||||
|
||||
Vertex Vertex::operator+(const Vertex & other) const
|
||||
Vertex Vertex::operator+(Vertex & other)
|
||||
{
|
||||
return Vertex(x+other.x, y+other.y, z+other.z, normalX, normalY, normalZ, texX, texY);
|
||||
}
|
||||
|
||||
@@ -16,9 +16,9 @@ public:
|
||||
float texX;
|
||||
float texY;
|
||||
|
||||
Vertex operator/(const float &other) const;
|
||||
Vertex operator*(const Vertex &other) const;
|
||||
Vertex operator*(const float &other) const;
|
||||
Vertex operator+(const Vertex &other) const;
|
||||
Vertex operator/(float &other);
|
||||
Vertex operator*(Vertex &other);
|
||||
Vertex operator*(float &other);
|
||||
Vertex operator+(Vertex &other);
|
||||
};
|
||||
|
||||
|
||||
@@ -1,93 +0,0 @@
|
||||
//
|
||||
// Created by janco on 25-5-16.
|
||||
//
|
||||
|
||||
#include "Weapon.h"
|
||||
#include "Model.h"
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <cmath>
|
||||
|
||||
|
||||
Weapon::Weapon(std::string name, int damage, Element e, std::string modelFilename, float scale, Vec3f location, Vec2f rotation,
|
||||
Vec3f offsetPlayer, Vec3f ankerPoint,
|
||||
Vec2f maxRotation, Vec2f minRotation,
|
||||
Vec3f collision){
|
||||
|
||||
weaponmodel = Model::load(modelFilename);
|
||||
rotate(rotation);
|
||||
move(location);
|
||||
this->scale = scale;
|
||||
|
||||
this->name = name;
|
||||
this->damage = damage;
|
||||
this->element = e;
|
||||
|
||||
this->offsetPlayer = offsetPlayer;
|
||||
this->ankerPoint = ankerPoint;
|
||||
this->maxRotation = maxRotation;
|
||||
this->minRotation = minRotation;
|
||||
this->collision = collision;
|
||||
};
|
||||
|
||||
Weapon::~Weapon(){
|
||||
|
||||
}
|
||||
|
||||
void Weapon::rotateWeapon(Vec3f rotation){
|
||||
if(rotation.x < maxRotation.x && rotation.x > minRotation.x){
|
||||
rotationWeapon.x = rotation.x;
|
||||
}
|
||||
if(rotation.z < maxRotation.y && rotation.z > minRotation.y){
|
||||
rotationWeapon.z = rotation.z;
|
||||
}
|
||||
rotationWeapon.y = rotation.y;
|
||||
}
|
||||
|
||||
void Weapon::rotate(Vec2f rotation){
|
||||
this->rotation.y = -rotation.y;
|
||||
}
|
||||
|
||||
void Weapon::move(Vec3f location){
|
||||
position = location;
|
||||
}
|
||||
|
||||
void Weapon::draw(){
|
||||
if (weaponmodel != nullptr)
|
||||
{
|
||||
glPushMatrix();
|
||||
|
||||
//Player position and rotation
|
||||
glTranslatef(position.x, position.y, position.z);
|
||||
glRotatef(rotation.x, 1, 0, 0);
|
||||
glRotatef(rotation.y, 0, 1, 0);
|
||||
glRotatef(rotation.z, 0, 0, 1);
|
||||
|
||||
//offset from player
|
||||
glTranslatef(offsetPlayer.x, offsetPlayer.y, offsetPlayer.z);
|
||||
|
||||
//Rotate weapon itself, from specific anker point
|
||||
glTranslatef(ankerPoint.x, ankerPoint.y, ankerPoint.z);
|
||||
glRotatef(rotationWeapon.z, 0, 0, 1);
|
||||
glRotatef(rotationWeapon.y, 0, 1, 0);
|
||||
glRotatef(rotationWeapon.x, 1, 0, 0);
|
||||
glTranslatef(-ankerPoint.x, -ankerPoint.y, -ankerPoint.z);
|
||||
|
||||
glScalef(scale, scale, scale);
|
||||
|
||||
weaponmodel->draw();
|
||||
|
||||
//Test code for finding anker point
|
||||
glColor3ub(255, 255, 0);
|
||||
glTranslatef(ankerPoint.x, ankerPoint.y, ankerPoint.z);
|
||||
glBegin(GL_LINES);
|
||||
glVertex2f(0, 4);
|
||||
glVertex2f(0, -4);
|
||||
glVertex2f(4, 0);
|
||||
glVertex2f(-4, 0);
|
||||
glEnd();
|
||||
|
||||
glPopMatrix();
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,40 +0,0 @@
|
||||
//
|
||||
// Created by janco on 25-5-16.
|
||||
//
|
||||
|
||||
#ifndef CRYSTALPOINT_WEAPON_H
|
||||
#define CRYSTALPOINT_WEAPON_H
|
||||
|
||||
#include "Vector.h"
|
||||
#include "Model.h"
|
||||
#include <string>
|
||||
|
||||
class Weapon {
|
||||
public:
|
||||
enum Element {FIRE, WATER, EARTH, AIR};
|
||||
|
||||
Weapon(std::string name, int damage, Element element, std::string modelFilename, float scale, Vec3f location, Vec2f rotation,
|
||||
Vec3f offsetPlayer, Vec3f ankerPoint,
|
||||
Vec2f maxRotation, Vec2f minXRotation,
|
||||
Vec3f collision);
|
||||
~Weapon();
|
||||
|
||||
void draw();
|
||||
void rotateWeapon(Vec3f rotation);
|
||||
void rotate(Vec2f rotation);
|
||||
void move(Vec3f location);
|
||||
|
||||
std::string name;
|
||||
unsigned int damage;
|
||||
Element element;
|
||||
|
||||
Model* weaponmodel;
|
||||
|
||||
float scale;
|
||||
Vec3f position, rotation, rotationWeapon;
|
||||
Vec3f offsetPlayer, ankerPoint, collision;
|
||||
Vec2f maxRotation, minRotation;
|
||||
};
|
||||
|
||||
|
||||
#endif //CRYSTALPOINT_WEAPON_H
|
||||
@@ -3,23 +3,18 @@
|
||||
#include "Entity.h"
|
||||
#include "json.h"
|
||||
#include "Model.h"
|
||||
#include "CrystalPoint.h"
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <algorithm>
|
||||
#include "WorldHandler.h"
|
||||
|
||||
World::World(const std::string &fileName)
|
||||
{
|
||||
nextworld = false;
|
||||
|
||||
//Store player instance
|
||||
player = Player::getInstance();
|
||||
|
||||
|
||||
//Create the interface
|
||||
interface = new Interface();
|
||||
|
||||
|
||||
//Open world json file
|
||||
std::ifstream file(fileName);
|
||||
if(!file.is_open())
|
||||
@@ -28,27 +23,15 @@ World::World(const std::string &fileName)
|
||||
json::Value v = json::readJson(file);
|
||||
file.close();
|
||||
|
||||
|
||||
//Check file
|
||||
if(v["world"].isNull() || v["world"]["heightmap"].isNull() || v["world"]["skybox"].isNull())
|
||||
if(v["world"].isNull() || v["world"]["heightmap"].isNull())
|
||||
std::cout << "Invalid world file: world - " << fileName << "\n";
|
||||
if (v["world"]["object-templates"].isNull())
|
||||
std::cout << "Invalid world file: object templates - " << fileName << "\n";
|
||||
if (v["player"].isNull() || v["player"]["startposition"].isNull())
|
||||
std::cout << "Invalid world file: player - " << fileName << "\n";
|
||||
if (v["objects"].isNull())
|
||||
std::cout << "Invalid world file: objects - " << fileName << "\n";
|
||||
if (v["enemies"].isNull())
|
||||
std::cout << "Invalid world file: enemies - " << fileName << "\n";
|
||||
if (v["crystal"].isNull())
|
||||
std::cout << "Invalid world file: crystals - " << fileName << "\n";
|
||||
|
||||
|
||||
if (!v["world"]["loadingscreen"].isNull())
|
||||
{
|
||||
ls.setTexture(v["world"]["loadingscreen"].asString());
|
||||
ls.draw();
|
||||
}
|
||||
if (v["world"]["object-templates"].isNull())
|
||||
std::cout << "Invalid world file: object templates - " << fileName << "\n";
|
||||
|
||||
//Load object templates
|
||||
for (auto objt : v["world"]["object-templates"])
|
||||
@@ -59,28 +42,19 @@ World::World(const std::string &fileName)
|
||||
cancollide = objt["collision"].asBool();
|
||||
|
||||
objecttemplates.push_back(std::pair<int, std::pair<std::string, bool>>(objt["color"], std::pair<std::string, bool>(objt["file"], cancollide)));
|
||||
|
||||
}
|
||||
|
||||
//Generate heightmap for this world
|
||||
heightmap = new HeightMap(v["world"]["heightmap"].asString(), this);
|
||||
|
||||
|
||||
//Load skybox
|
||||
skybox = new Skybox(15000.0f, v["world"]["skybox"].asString());
|
||||
skybox->init();
|
||||
|
||||
|
||||
//Map different texture to heightmap if available
|
||||
if(!v["world"]["texture"].isNull())
|
||||
heightmap->SetTexture(v["world"]["texture"].asString());
|
||||
|
||||
|
||||
//Set player starting position
|
||||
player->position.x = v["player"]["startposition"][0].asFloat();
|
||||
player->position.y = v["player"]["startposition"][1].asFloat();
|
||||
player->position.z = v["player"]["startposition"][2].asFloat();
|
||||
player->position.y = heightmap->GetHeight(player->position.x, player->position.z);
|
||||
|
||||
|
||||
//Load and place objects into world
|
||||
for (auto object : v["objects"])
|
||||
@@ -110,13 +84,9 @@ World::World(const std::string &fileName)
|
||||
|
||||
//Create
|
||||
Vec3f position(object["pos"][0].asFloat(), object["pos"][1].asFloat(), object["pos"][2].asFloat());
|
||||
position.y = getHeight(position.x, position.z);
|
||||
|
||||
entities.push_back(new LevelObject(object["file"].asString(), position, rotation, scale, hasCollision));
|
||||
|
||||
}
|
||||
|
||||
maxEnemies = 0;
|
||||
//Load and place enemies into world
|
||||
for (auto e : v["enemies"])
|
||||
{
|
||||
@@ -138,104 +108,9 @@ World::World(const std::string &fileName)
|
||||
if (e["file"].isNull())
|
||||
std::cout << "Invalid world file: enemies file - " << fileName << "\n";
|
||||
|
||||
//Music
|
||||
if (e["music"].isNull())
|
||||
std::cout << "Invalid world file: enemies music - " << fileName << "\n";
|
||||
|
||||
//Damage
|
||||
if (e["damage"].isNull())
|
||||
std::cout << "Invalid world file: enemies damage - " << fileName << "\n";
|
||||
|
||||
//Health
|
||||
if (e["health"].isNull())
|
||||
std::cout << "Invalid world file: enemies health - " << fileName << "\n";
|
||||
|
||||
//Create
|
||||
Vec3f position(e["pos"][0].asFloat(), e["pos"][1].asFloat(), e["pos"][2].asFloat());
|
||||
position.y = getHeight(position.x, position.z) + 2.0f;
|
||||
|
||||
maxEnemies++;
|
||||
enemies.push_back(new Enemy(e["file"].asString(), e["music"].asString(), e["damage"].asFloat(), e["health"].asFloat(), position, rotation, scale));
|
||||
|
||||
}
|
||||
maxCrystals = 0;
|
||||
if (!v["crystal"].isNull())
|
||||
{
|
||||
std::string filled = "unknown";
|
||||
std::string empty = "unknown";
|
||||
|
||||
if(!v["crystal"]["full texture"].isNull())
|
||||
filled = v["crystal"]["full texture"].asString();
|
||||
|
||||
if(!v["crystal"]["empty texture"].isNull())
|
||||
empty = v["crystal"]["empty texture"].asString();
|
||||
|
||||
if (!v["crystal"]["instances"].isNull())
|
||||
{
|
||||
for (auto instance : v["crystal"]["instances"])
|
||||
{
|
||||
Vec3f position(0, 0, 0);
|
||||
Vec3f rotation(0, 0, 0);
|
||||
float scale = 1.0f;
|
||||
|
||||
if (!instance["pos"].isNull())
|
||||
{
|
||||
position.x = instance["pos"][0];
|
||||
position.y = instance["pos"][1];
|
||||
position.z = instance["pos"][2];
|
||||
}
|
||||
|
||||
if (!instance["rot"].isNull())
|
||||
{
|
||||
rotation.x = instance["rot"][0];
|
||||
rotation.y = instance["rot"][1];
|
||||
rotation.z = instance["rot"][2];
|
||||
}
|
||||
|
||||
if (!instance["scale"].isNull())
|
||||
scale = instance["scale"].asFloat();
|
||||
|
||||
position.y = getHeight(position.x, position.z);
|
||||
maxCrystals++;
|
||||
Crystal *c = new Crystal(filled, empty, position, rotation, scale);
|
||||
|
||||
entities.push_back(c);
|
||||
|
||||
}
|
||||
interface->maxCrystals = maxCrystals;
|
||||
}
|
||||
}
|
||||
|
||||
if (!v["world"]["music"].isNull())
|
||||
{
|
||||
sound_id = CrystalPoint::GetSoundSystem().LoadSound(v["world"]["music"].asString().c_str(), true);
|
||||
music = CrystalPoint::GetSoundSystem().GetSound(sound_id);
|
||||
|
||||
}
|
||||
|
||||
if (!v["portal"].isNull())
|
||||
{
|
||||
Vec3f pos(0, 0, 0);
|
||||
if (!v["portal"]["pos"].isNull())
|
||||
pos = Vec3f(v["portal"]["pos"][0].asFloat(),
|
||||
v["portal"]["pos"][1].asFloat(),
|
||||
v["portal"]["pos"][2].asFloat());
|
||||
|
||||
pos.y = getHeight(pos.x, pos.z);
|
||||
|
||||
Vec3f rot(0, 0, 0);
|
||||
if (!v["portal"]["rot"].isNull())
|
||||
pos = Vec3f(v["portal"]["rot"][0].asFloat(),
|
||||
v["portal"]["rot"][1].asFloat(),
|
||||
v["portal"]["rot"][2].asFloat());
|
||||
|
||||
float scale = 1.0f;
|
||||
if (!v["portal"]["scale"].isNull())
|
||||
scale = !v["portal"]["scale"].asFloat();
|
||||
|
||||
portal = new Portal(v["portal"]["file"], pos, rot, scale);
|
||||
entities.push_back(portal);
|
||||
portal->maxCrystals = maxCrystals;
|
||||
enemies.push_back(new Enemy(e["file"].asString(), position, rotation, scale));
|
||||
|
||||
}
|
||||
}
|
||||
@@ -244,10 +119,6 @@ World::World(const std::string &fileName)
|
||||
World::~World()
|
||||
{
|
||||
delete heightmap;
|
||||
music->Stop();
|
||||
CrystalPoint::GetSoundSystem().UnloadSound(sound_id);
|
||||
delete skybox;
|
||||
delete portal;
|
||||
}
|
||||
|
||||
std::pair<std::string, bool> World::getObjectFromValue(int val)
|
||||
@@ -268,25 +139,13 @@ float World::getHeight(float x, float y)
|
||||
|
||||
void World::draw()
|
||||
{
|
||||
|
||||
player->setCamera();
|
||||
|
||||
float lightPosition[4] = { 0, 2, 1, 0 };
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
|
||||
|
||||
GLfloat lightAmbient[] = { 0.05, 0.05, 0.05, 0 };
|
||||
GLfloat light_diffuse[] = { 0.9, 0.9, 0.9, 0 };
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
|
||||
float lightAmbient[4] = { 0.2, 0.2, 0.2, 1 };
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
|
||||
|
||||
GLfloat mat_specular[] = { 0.15, 0.15, 0.15, 0 };
|
||||
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
||||
|
||||
|
||||
|
||||
player->setCamera();
|
||||
skybox->draw();
|
||||
player->draw();
|
||||
|
||||
heightmap->Draw();
|
||||
|
||||
for (auto &enemy : enemies)
|
||||
@@ -300,31 +159,23 @@ void World::draw()
|
||||
|
||||
void World::update(float elapsedTime)
|
||||
{
|
||||
if (nextworld)
|
||||
{
|
||||
WorldHandler::getInstance()->NextWorld();
|
||||
return;
|
||||
}
|
||||
|
||||
music->SetPos(player->position, Vec3f());
|
||||
|
||||
if (music->IsPlaying() == false)
|
||||
{
|
||||
music->Play();
|
||||
}
|
||||
for (auto &entity : entities)
|
||||
entity->update(elapsedTime);
|
||||
|
||||
int count = 0;
|
||||
int remove = false;
|
||||
|
||||
for (auto &enemy : enemies)
|
||||
{
|
||||
|
||||
//Al deze code zou in enemy moeten staan
|
||||
enemy->inEyeSight(player->position);
|
||||
|
||||
if (enemy->position.Distance(player->position) <= enemy->radius)
|
||||
{
|
||||
enemy->hasTarget = true;
|
||||
enemy->target.x = player->position.x;
|
||||
enemy->target.z = player->position.z;
|
||||
}
|
||||
else
|
||||
enemy->hasTarget = false;
|
||||
|
||||
Vec3f oldpos = enemy->position;
|
||||
enemy->update(elapsedTime);
|
||||
if (enemy->hasTarget)
|
||||
{
|
||||
@@ -332,40 +183,16 @@ void World::update(float elapsedTime)
|
||||
{
|
||||
if (e->canCollide && e->inObject(enemy->position))
|
||||
{
|
||||
enemy->collide(e);
|
||||
Vec3f difference = e->position - enemy->position; //zou misschien omgedraait moeten worden
|
||||
difference.Normalize();
|
||||
difference = difference * (e->model->radius + 0.01f);
|
||||
enemy->position = e->position + difference;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (enemy->attack)
|
||||
{
|
||||
remove = true;
|
||||
continue;
|
||||
}
|
||||
enemy->position.y = getHeight(enemy->position.x, enemy->position.z);
|
||||
|
||||
if(!remove)
|
||||
count++;
|
||||
//tot hier
|
||||
}
|
||||
|
||||
if (remove)
|
||||
{
|
||||
player->XpUp(enemies[count]->xp);
|
||||
delete enemies[count];
|
||||
|
||||
enemies.erase(enemies.begin() + count);
|
||||
player->HpUp(10);
|
||||
}
|
||||
|
||||
skybox->update(elapsedTime, maxEnemies - enemies.size(), maxEnemies);
|
||||
|
||||
if (portal->mayEnter)
|
||||
{
|
||||
if (portal->enter(elapsedTime))
|
||||
nextworld = true;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void World::addLevelObject(LevelObject* obj)
|
||||
@@ -375,13 +202,10 @@ void World::addLevelObject(LevelObject* obj)
|
||||
|
||||
bool World::isPlayerPositionValid()
|
||||
{
|
||||
for (auto &e : entities)
|
||||
for (auto e : entities)
|
||||
{
|
||||
if (e->canCollide && e->inObject(player->position))
|
||||
{
|
||||
e->collide();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -6,11 +6,6 @@
|
||||
#include "Enemy.h"
|
||||
#include "LevelObject.h"
|
||||
#include "Interface.h"
|
||||
#include "Crystal.h"
|
||||
#include "Skybox.h"
|
||||
#include "CrystalPoint.h"
|
||||
#include "Portal.h"
|
||||
#include "LoadingScreen.h"
|
||||
|
||||
class Entity;
|
||||
|
||||
@@ -18,23 +13,13 @@ class World
|
||||
{
|
||||
private:
|
||||
std::vector<std::pair<int, std::pair<std::string, bool>>> objecttemplates;
|
||||
Sound* music;
|
||||
|
||||
Player* player;
|
||||
HeightMap* heightmap;
|
||||
Interface* interface;
|
||||
Skybox* skybox;
|
||||
Portal* portal;
|
||||
|
||||
bool nextworld;
|
||||
|
||||
int sound_id,maxCrystals,maxEnemies;
|
||||
|
||||
std::vector<Entity*> entities;
|
||||
std::vector<Enemy*> enemies;
|
||||
//std::vector<Crystal*> crystals;
|
||||
|
||||
LoadingScreen ls;
|
||||
public:
|
||||
World(const std::string &fileName);
|
||||
~World();
|
||||
@@ -45,6 +30,5 @@ public:
|
||||
float getHeight(float x, float y);
|
||||
void addLevelObject(LevelObject* obj);
|
||||
std::pair<std::string, bool> getObjectFromValue(int i);
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -97,7 +97,6 @@ bool WorldHandler::isPlayerPositionValid(void)
|
||||
{
|
||||
if(!loadingWorld)
|
||||
return world->isPlayerPositionValid();
|
||||
return false;
|
||||
}
|
||||
|
||||
float WorldHandler::getHeight(float x, float y)
|
||||
@@ -126,7 +125,6 @@ void WorldHandler::NextWorld()
|
||||
if (!loadingWorld)
|
||||
{
|
||||
ChangeWorld(worldIndex + 1);
|
||||
Player::getInstance()->crystals = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -135,6 +133,5 @@ void WorldHandler::PreviousWorld()
|
||||
if (!loadingWorld)
|
||||
{
|
||||
ChangeWorld(worldIndex - 1);
|
||||
Player::getInstance()->crystals = 0;
|
||||
}
|
||||
}
|
||||
@@ -1,221 +0,0 @@
|
||||
/*!
|
||||
* \file serial/impl/unix.h
|
||||
* \author William Woodall <wjwwood@gmail.com>
|
||||
* \author John Harrison <ash@greaterthaninfinity.com>
|
||||
* \version 0.1
|
||||
*
|
||||
* \section LICENSE
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2012 William Woodall, John Harrison
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* \section DESCRIPTION
|
||||
*
|
||||
* This provides a unix based pimpl for the Serial class. This implementation is
|
||||
* based off termios.h and uses select for multiplexing the IO ports.
|
||||
*
|
||||
*/
|
||||
|
||||
#if !defined(_WIN32)
|
||||
|
||||
#ifndef SERIAL_IMPL_UNIX_H
|
||||
#define SERIAL_IMPL_UNIX_H
|
||||
|
||||
|
||||
#include <pthread.h>
|
||||
#include "../serial.h"
|
||||
|
||||
namespace serial {
|
||||
|
||||
using std::size_t;
|
||||
using std::string;
|
||||
using std::invalid_argument;
|
||||
|
||||
using serial::SerialException;
|
||||
using serial::IOException;
|
||||
|
||||
class MillisecondTimer {
|
||||
public:
|
||||
MillisecondTimer(const uint32_t millis);
|
||||
int64_t remaining();
|
||||
|
||||
private:
|
||||
static timespec timespec_now();
|
||||
timespec expiry;
|
||||
};
|
||||
|
||||
class serial::Serial::SerialImpl {
|
||||
public:
|
||||
SerialImpl (const string &port,
|
||||
unsigned long baudrate,
|
||||
bytesize_t bytesize,
|
||||
parity_t parity,
|
||||
stopbits_t stopbits,
|
||||
flowcontrol_t flowcontrol);
|
||||
|
||||
virtual ~SerialImpl ();
|
||||
|
||||
void
|
||||
open ();
|
||||
|
||||
void
|
||||
close ();
|
||||
|
||||
bool
|
||||
isOpen () const;
|
||||
|
||||
size_t
|
||||
available ();
|
||||
|
||||
bool
|
||||
waitReadable (uint32_t timeout);
|
||||
|
||||
void
|
||||
waitByteTimes (size_t count);
|
||||
|
||||
size_t
|
||||
read (uint8_t *buf, size_t size = 1);
|
||||
|
||||
size_t
|
||||
write (const uint8_t *data, size_t length);
|
||||
|
||||
void
|
||||
flush ();
|
||||
|
||||
void
|
||||
flushInput ();
|
||||
|
||||
void
|
||||
flushOutput ();
|
||||
|
||||
void
|
||||
sendBreak (int duration);
|
||||
|
||||
void
|
||||
setBreak (bool level);
|
||||
|
||||
void
|
||||
setRTS (bool level);
|
||||
|
||||
void
|
||||
setDTR (bool level);
|
||||
|
||||
bool
|
||||
waitForChange ();
|
||||
|
||||
bool
|
||||
getCTS ();
|
||||
|
||||
bool
|
||||
getDSR ();
|
||||
|
||||
bool
|
||||
getRI ();
|
||||
|
||||
bool
|
||||
getCD ();
|
||||
|
||||
void
|
||||
setPort (const string &port);
|
||||
|
||||
string
|
||||
getPort () const;
|
||||
|
||||
void
|
||||
setTimeout (Timeout &timeout);
|
||||
|
||||
Timeout
|
||||
getTimeout () const;
|
||||
|
||||
void
|
||||
setBaudrate (unsigned long baudrate);
|
||||
|
||||
unsigned long
|
||||
getBaudrate () const;
|
||||
|
||||
void
|
||||
setBytesize (bytesize_t bytesize);
|
||||
|
||||
bytesize_t
|
||||
getBytesize () const;
|
||||
|
||||
void
|
||||
setParity (parity_t parity);
|
||||
|
||||
parity_t
|
||||
getParity () const;
|
||||
|
||||
void
|
||||
setStopbits (stopbits_t stopbits);
|
||||
|
||||
stopbits_t
|
||||
getStopbits () const;
|
||||
|
||||
void
|
||||
setFlowcontrol (flowcontrol_t flowcontrol);
|
||||
|
||||
flowcontrol_t
|
||||
getFlowcontrol () const;
|
||||
|
||||
void
|
||||
readLock ();
|
||||
|
||||
void
|
||||
readUnlock ();
|
||||
|
||||
void
|
||||
writeLock ();
|
||||
|
||||
void
|
||||
writeUnlock ();
|
||||
|
||||
protected:
|
||||
void reconfigurePort ();
|
||||
|
||||
private:
|
||||
string port_; // Path to the file descriptor
|
||||
int fd_; // The current file descriptor
|
||||
|
||||
bool is_open_;
|
||||
bool xonxoff_;
|
||||
bool rtscts_;
|
||||
|
||||
Timeout timeout_; // Timeout for read operations
|
||||
unsigned long baudrate_; // Baudrate
|
||||
uint32_t byte_time_ns_; // Nanoseconds to transmit/receive a single byte
|
||||
|
||||
parity_t parity_; // Parity
|
||||
bytesize_t bytesize_; // Size of the bytes
|
||||
stopbits_t stopbits_; // Stop Bits
|
||||
flowcontrol_t flowcontrol_; // Flow Control
|
||||
|
||||
// Mutex used to lock the read functions
|
||||
pthread_mutex_t read_mutex;
|
||||
// Mutex used to lock the write functions
|
||||
pthread_mutex_t write_mutex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // SERIAL_IMPL_UNIX_H
|
||||
|
||||
#endif // !defined(_WIN32)
|
||||
@@ -1,207 +0,0 @@
|
||||
/*!
|
||||
* \file serial/impl/windows.h
|
||||
* \author William Woodall <wjwwood@gmail.com>
|
||||
* \author John Harrison <ash@greaterthaninfinity.com>
|
||||
* \version 0.1
|
||||
*
|
||||
* \section LICENSE
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2012 William Woodall, John Harrison
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* \section DESCRIPTION
|
||||
*
|
||||
* This provides a windows implementation of the Serial class interface.
|
||||
*
|
||||
*/
|
||||
|
||||
#if defined(_WIN32)
|
||||
|
||||
#ifndef SERIAL_IMPL_WINDOWS_H
|
||||
#define SERIAL_IMPL_WINDOWS_H
|
||||
|
||||
#include "include/serial.h"
|
||||
|
||||
#include "windows.h"
|
||||
|
||||
namespace serial {
|
||||
|
||||
using std::string;
|
||||
using std::wstring;
|
||||
using std::invalid_argument;
|
||||
|
||||
using serial::SerialException;
|
||||
using serial::IOException;
|
||||
|
||||
class serial::Serial::SerialImpl {
|
||||
public:
|
||||
SerialImpl (const string &port,
|
||||
unsigned long baudrate,
|
||||
bytesize_t bytesize,
|
||||
parity_t parity,
|
||||
stopbits_t stopbits,
|
||||
flowcontrol_t flowcontrol);
|
||||
|
||||
virtual ~SerialImpl ();
|
||||
|
||||
void
|
||||
open ();
|
||||
|
||||
void
|
||||
close ();
|
||||
|
||||
bool
|
||||
isOpen () const;
|
||||
|
||||
size_t
|
||||
available ();
|
||||
|
||||
bool
|
||||
waitReadable (uint32_t timeout);
|
||||
|
||||
void
|
||||
waitByteTimes (size_t count);
|
||||
|
||||
size_t
|
||||
read (uint8_t *buf, size_t size = 1);
|
||||
|
||||
size_t
|
||||
write (const uint8_t *data, size_t length);
|
||||
|
||||
void
|
||||
flush ();
|
||||
|
||||
void
|
||||
flushInput ();
|
||||
|
||||
void
|
||||
flushOutput ();
|
||||
|
||||
void
|
||||
sendBreak (int duration);
|
||||
|
||||
void
|
||||
setBreak (bool level);
|
||||
|
||||
void
|
||||
setRTS (bool level);
|
||||
|
||||
void
|
||||
setDTR (bool level);
|
||||
|
||||
bool
|
||||
waitForChange ();
|
||||
|
||||
bool
|
||||
getCTS ();
|
||||
|
||||
bool
|
||||
getDSR ();
|
||||
|
||||
bool
|
||||
getRI ();
|
||||
|
||||
bool
|
||||
getCD ();
|
||||
|
||||
void
|
||||
setPort (const string &port);
|
||||
|
||||
string
|
||||
getPort () const;
|
||||
|
||||
void
|
||||
setTimeout (Timeout &timeout);
|
||||
|
||||
Timeout
|
||||
getTimeout () const;
|
||||
|
||||
void
|
||||
setBaudrate (unsigned long baudrate);
|
||||
|
||||
unsigned long
|
||||
getBaudrate () const;
|
||||
|
||||
void
|
||||
setBytesize (bytesize_t bytesize);
|
||||
|
||||
bytesize_t
|
||||
getBytesize () const;
|
||||
|
||||
void
|
||||
setParity (parity_t parity);
|
||||
|
||||
parity_t
|
||||
getParity () const;
|
||||
|
||||
void
|
||||
setStopbits (stopbits_t stopbits);
|
||||
|
||||
stopbits_t
|
||||
getStopbits () const;
|
||||
|
||||
void
|
||||
setFlowcontrol (flowcontrol_t flowcontrol);
|
||||
|
||||
flowcontrol_t
|
||||
getFlowcontrol () const;
|
||||
|
||||
void
|
||||
readLock ();
|
||||
|
||||
void
|
||||
readUnlock ();
|
||||
|
||||
void
|
||||
writeLock ();
|
||||
|
||||
void
|
||||
writeUnlock ();
|
||||
|
||||
protected:
|
||||
void reconfigurePort ();
|
||||
|
||||
private:
|
||||
wstring port_; // Path to the file descriptor
|
||||
HANDLE fd_;
|
||||
|
||||
bool is_open_;
|
||||
|
||||
Timeout timeout_; // Timeout for read operations
|
||||
unsigned long baudrate_; // Baudrate
|
||||
|
||||
parity_t parity_; // Parity
|
||||
bytesize_t bytesize_; // Size of the bytes
|
||||
stopbits_t stopbits_; // Stop Bits
|
||||
flowcontrol_t flowcontrol_; // Flow Control
|
||||
|
||||
// Mutex used to lock the read functions
|
||||
HANDLE read_mutex;
|
||||
// Mutex used to lock the write functions
|
||||
HANDLE write_mutex;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // SERIAL_IMPL_WINDOWS_H
|
||||
|
||||
#endif // if defined(_WIN32)
|
||||
@@ -1,772 +0,0 @@
|
||||
/*!
|
||||
* \file serial/serial.h
|
||||
* \author William Woodall <wjwwood@gmail.com>
|
||||
* \author John Harrison <ash.gti@gmail.com>
|
||||
* \version 0.1
|
||||
*
|
||||
* \section LICENSE
|
||||
*
|
||||
* The MIT License
|
||||
*
|
||||
* Copyright (c) 2012 William Woodall
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
* to deal in the Software without restriction, including without limitation
|
||||
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
* and/or sell copies of the Software, and to permit persons to whom the
|
||||
* Software is furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
* DEALINGS IN THE SOFTWARE.
|
||||
*
|
||||
* \section DESCRIPTION
|
||||
*
|
||||
* This provides a cross platform interface for interacting with Serial Ports.
|
||||
*/
|
||||
|
||||
#ifndef SERIAL_H
|
||||
#define SERIAL_H
|
||||
|
||||
#include <limits>
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
#include <sstream>
|
||||
#include <exception>
|
||||
#include <stdexcept>
|
||||
|
||||
#define THROW(exceptionClass, message) throw exceptionClass(__FILE__, \
|
||||
__LINE__, (message) )
|
||||
|
||||
namespace serial {
|
||||
|
||||
/*!
|
||||
* Enumeration defines the possible bytesizes for the serial port.
|
||||
*/
|
||||
typedef enum {
|
||||
fivebits = 5,
|
||||
sixbits = 6,
|
||||
sevenbits = 7,
|
||||
eightbits = 8
|
||||
} bytesize_t;
|
||||
|
||||
/*!
|
||||
* Enumeration defines the possible parity types for the serial port.
|
||||
*/
|
||||
typedef enum {
|
||||
parity_none = 0,
|
||||
parity_odd = 1,
|
||||
parity_even = 2,
|
||||
parity_mark = 3,
|
||||
parity_space = 4
|
||||
} parity_t;
|
||||
|
||||
/*!
|
||||
* Enumeration defines the possible stopbit types for the serial port.
|
||||
*/
|
||||
typedef enum {
|
||||
stopbits_one = 1,
|
||||
stopbits_two = 2,
|
||||
stopbits_one_point_five
|
||||
} stopbits_t;
|
||||
|
||||
/*!
|
||||
* Enumeration defines the possible flowcontrol types for the serial port.
|
||||
*/
|
||||
typedef enum {
|
||||
flowcontrol_none = 0,
|
||||
flowcontrol_software,
|
||||
flowcontrol_hardware
|
||||
} flowcontrol_t;
|
||||
|
||||
/*!
|
||||
* Structure for setting the timeout of the serial port, times are
|
||||
* in milliseconds.
|
||||
*
|
||||
* In order to disable the interbyte timeout, set it to Timeout::max().
|
||||
*/
|
||||
struct Timeout {
|
||||
#ifdef max
|
||||
# undef max
|
||||
#endif
|
||||
static uint32_t max() {return std::numeric_limits<uint32_t>::max();}
|
||||
/*!
|
||||
* Convenience function to generate Timeout structs using a
|
||||
* single absolute timeout.
|
||||
*
|
||||
* \param timeout A long that defines the time in milliseconds until a
|
||||
* timeout occurs after a call to read or write is made.
|
||||
*
|
||||
* \return Timeout struct that represents this simple timeout provided.
|
||||
*/
|
||||
static Timeout simpleTimeout(uint32_t timeout) {
|
||||
return Timeout(max(), timeout, 0, timeout, 0);
|
||||
}
|
||||
|
||||
/*! Number of milliseconds between bytes received to timeout on. */
|
||||
uint32_t inter_byte_timeout;
|
||||
/*! A constant number of milliseconds to wait after calling read. */
|
||||
uint32_t read_timeout_constant;
|
||||
/*! A multiplier against the number of requested bytes to wait after
|
||||
* calling read.
|
||||
*/
|
||||
uint32_t read_timeout_multiplier;
|
||||
/*! A constant number of milliseconds to wait after calling write. */
|
||||
uint32_t write_timeout_constant;
|
||||
/*! A multiplier against the number of requested bytes to wait after
|
||||
* calling write.
|
||||
*/
|
||||
uint32_t write_timeout_multiplier;
|
||||
|
||||
explicit Timeout (uint32_t inter_byte_timeout_=0,
|
||||
uint32_t read_timeout_constant_=0,
|
||||
uint32_t read_timeout_multiplier_=0,
|
||||
uint32_t write_timeout_constant_=0,
|
||||
uint32_t write_timeout_multiplier_=0)
|
||||
: inter_byte_timeout(inter_byte_timeout_),
|
||||
read_timeout_constant(read_timeout_constant_),
|
||||
read_timeout_multiplier(read_timeout_multiplier_),
|
||||
write_timeout_constant(write_timeout_constant_),
|
||||
write_timeout_multiplier(write_timeout_multiplier_)
|
||||
{}
|
||||
};
|
||||
|
||||
/*!
|
||||
* Class that provides a portable serial port interface.
|
||||
*/
|
||||
class Serial {
|
||||
public:
|
||||
/*!
|
||||
* Creates a Serial object and opens the port if a port is specified,
|
||||
* otherwise it remains closed until serial::Serial::open is called.
|
||||
*
|
||||
* \param port A std::string containing the address of the serial port,
|
||||
* which would be something like 'COM1' on Windows and '/dev/ttyS0'
|
||||
* on Linux.
|
||||
*
|
||||
* \param baudrate An unsigned 32-bit integer that represents the baudrate
|
||||
*
|
||||
* \param timeout A serial::Timeout struct that defines the timeout
|
||||
* conditions for the serial port. \see serial::Timeout
|
||||
*
|
||||
* \param bytesize Size of each byte in the serial transmission of data,
|
||||
* default is eightbits, possible values are: fivebits, sixbits, sevenbits,
|
||||
* eightbits
|
||||
*
|
||||
* \param parity Method of parity, default is parity_none, possible values
|
||||
* are: parity_none, parity_odd, parity_even
|
||||
*
|
||||
* \param stopbits Number of stop bits used, default is stopbits_one,
|
||||
* possible values are: stopbits_one, stopbits_one_point_five, stopbits_two
|
||||
*
|
||||
* \param flowcontrol Type of flowcontrol used, default is
|
||||
* flowcontrol_none, possible values are: flowcontrol_none,
|
||||
* flowcontrol_software, flowcontrol_hardware
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::IOException
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
Serial (const std::string &port = "",
|
||||
uint32_t baudrate = 9600,
|
||||
Timeout timeout = Timeout(),
|
||||
bytesize_t bytesize = eightbits,
|
||||
parity_t parity = parity_none,
|
||||
stopbits_t stopbits = stopbits_one,
|
||||
flowcontrol_t flowcontrol = flowcontrol_none);
|
||||
|
||||
/*! Destructor */
|
||||
virtual ~Serial ();
|
||||
|
||||
/*!
|
||||
* Opens the serial port as long as the port is set and the port isn't
|
||||
* already open.
|
||||
*
|
||||
* If the port is provided to the constructor then an explicit call to open
|
||||
* is not needed.
|
||||
*
|
||||
* \see Serial::Serial
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
* \throw serial::SerialException
|
||||
* \throw serial::IOException
|
||||
*/
|
||||
void
|
||||
open ();
|
||||
|
||||
/*! Gets the open status of the serial port.
|
||||
*
|
||||
* \return Returns true if the port is open, false otherwise.
|
||||
*/
|
||||
bool
|
||||
isOpen () const;
|
||||
|
||||
/*! Closes the serial port. */
|
||||
void
|
||||
close ();
|
||||
|
||||
/*! Return the number of characters in the buffer. */
|
||||
size_t
|
||||
available ();
|
||||
|
||||
/*! Block until there is serial data to read or read_timeout_constant
|
||||
* number of milliseconds have elapsed. The return value is true when
|
||||
* the function exits with the port in a readable state, false otherwise
|
||||
* (due to timeout or select interruption). */
|
||||
bool
|
||||
waitReadable ();
|
||||
|
||||
/*! Block for a period of time corresponding to the transmission time of
|
||||
* count characters at present serial settings. This may be used in con-
|
||||
* junction with waitReadable to read larger blocks of data from the
|
||||
* port. */
|
||||
void
|
||||
waitByteTimes (size_t count);
|
||||
|
||||
/*! Read a given amount of bytes from the serial port into a given buffer.
|
||||
*
|
||||
* The read function will return in one of three cases:
|
||||
* * The number of requested bytes was read.
|
||||
* * In this case the number of bytes requested will match the size_t
|
||||
* returned by read.
|
||||
* * A timeout occurred, in this case the number of bytes read will not
|
||||
* match the amount requested, but no exception will be thrown. One of
|
||||
* two possible timeouts occurred:
|
||||
* * The inter byte timeout expired, this means that number of
|
||||
* milliseconds elapsed between receiving bytes from the serial port
|
||||
* exceeded the inter byte timeout.
|
||||
* * The total timeout expired, which is calculated by multiplying the
|
||||
* read timeout multiplier by the number of requested bytes and then
|
||||
* added to the read timeout constant. If that total number of
|
||||
* milliseconds elapses after the initial call to read a timeout will
|
||||
* occur.
|
||||
* * An exception occurred, in this case an actual exception will be thrown.
|
||||
*
|
||||
* \param buffer An uint8_t array of at least the requested size.
|
||||
* \param size A size_t defining how many bytes to be read.
|
||||
*
|
||||
* \return A size_t representing the number of bytes read as a result of the
|
||||
* call to read.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
size_t
|
||||
read (uint8_t *buffer, size_t size);
|
||||
|
||||
/*! Read a given amount of bytes from the serial port into a give buffer.
|
||||
*
|
||||
* \param buffer A reference to a std::vector of uint8_t.
|
||||
* \param size A size_t defining how many bytes to be read.
|
||||
*
|
||||
* \return A size_t representing the number of bytes read as a result of the
|
||||
* call to read.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
size_t
|
||||
read (std::vector<uint8_t> &buffer, size_t size = 1);
|
||||
|
||||
/*! Read a given amount of bytes from the serial port into a give buffer.
|
||||
*
|
||||
* \param buffer A reference to a std::string.
|
||||
* \param size A size_t defining how many bytes to be read.
|
||||
*
|
||||
* \return A size_t representing the number of bytes read as a result of the
|
||||
* call to read.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
size_t
|
||||
read (std::string &buffer, size_t size = 1);
|
||||
|
||||
/*! Read a given amount of bytes from the serial port and return a string
|
||||
* containing the data.
|
||||
*
|
||||
* \param size A size_t defining how many bytes to be read.
|
||||
*
|
||||
* \return A std::string containing the data read from the port.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
std::string
|
||||
read (size_t size = 1);
|
||||
|
||||
/*! Reads in a line or until a given delimiter has been processed.
|
||||
*
|
||||
* Reads from the serial port until a single line has been read.
|
||||
*
|
||||
* \param buffer A std::string reference used to store the data.
|
||||
* \param size A maximum length of a line, defaults to 65536 (2^16)
|
||||
* \param eol A string to match against for the EOL.
|
||||
*
|
||||
* \return A size_t representing the number of bytes read.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
size_t
|
||||
readline (std::string &buffer, size_t size = 65536, std::string eol = "\n");
|
||||
|
||||
/*! Reads in a line or until a given delimiter has been processed.
|
||||
*
|
||||
* Reads from the serial port until a single line has been read.
|
||||
*
|
||||
* \param size A maximum length of a line, defaults to 65536 (2^16)
|
||||
* \param eol A string to match against for the EOL.
|
||||
*
|
||||
* \return A std::string containing the line.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
std::string
|
||||
readline (size_t size = 65536, std::string eol = "\n");
|
||||
|
||||
/*! Reads in multiple lines until the serial port times out.
|
||||
*
|
||||
* This requires a timeout > 0 before it can be run. It will read until a
|
||||
* timeout occurs and return a list of strings.
|
||||
*
|
||||
* \param size A maximum length of combined lines, defaults to 65536 (2^16)
|
||||
*
|
||||
* \param eol A string to match against for the EOL.
|
||||
*
|
||||
* \return A vector<string> containing the lines.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
*/
|
||||
std::vector<std::string>
|
||||
readlines (size_t size = 65536, std::string eol = "\n");
|
||||
|
||||
/*! Write a string to the serial port.
|
||||
*
|
||||
* \param data A const reference containing the data to be written
|
||||
* to the serial port.
|
||||
*
|
||||
* \param size A size_t that indicates how many bytes should be written from
|
||||
* the given data buffer.
|
||||
*
|
||||
* \return A size_t representing the number of bytes actually written to
|
||||
* the serial port.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
* \throw serial::IOException
|
||||
*/
|
||||
size_t
|
||||
write (const uint8_t *data, size_t size);
|
||||
|
||||
/*! Write a string to the serial port.
|
||||
*
|
||||
* \param data A const reference containing the data to be written
|
||||
* to the serial port.
|
||||
*
|
||||
* \return A size_t representing the number of bytes actually written to
|
||||
* the serial port.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
* \throw serial::IOException
|
||||
*/
|
||||
size_t
|
||||
write (const std::vector<uint8_t> &data);
|
||||
|
||||
/*! Write a string to the serial port.
|
||||
*
|
||||
* \param data A const reference containing the data to be written
|
||||
* to the serial port.
|
||||
*
|
||||
* \return A size_t representing the number of bytes actually written to
|
||||
* the serial port.
|
||||
*
|
||||
* \throw serial::PortNotOpenedException
|
||||
* \throw serial::SerialException
|
||||
* \throw serial::IOException
|
||||
*/
|
||||
size_t
|
||||
write (const std::string &data);
|
||||
|
||||
/*! Sets the serial port identifier.
|
||||
*
|
||||
* \param port A const std::string reference containing the address of the
|
||||
* serial port, which would be something like 'COM1' on Windows and
|
||||
* '/dev/ttyS0' on Linux.
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setPort (const std::string &port);
|
||||
|
||||
/*! Gets the serial port identifier.
|
||||
*
|
||||
* \see Serial::setPort
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
std::string
|
||||
getPort () const;
|
||||
|
||||
/*! Sets the timeout for reads and writes using the Timeout struct.
|
||||
*
|
||||
* There are two timeout conditions described here:
|
||||
* * The inter byte timeout:
|
||||
* * The inter_byte_timeout component of serial::Timeout defines the
|
||||
* maximum amount of time, in milliseconds, between receiving bytes on
|
||||
* the serial port that can pass before a timeout occurs. Setting this
|
||||
* to zero will prevent inter byte timeouts from occurring.
|
||||
* * Total time timeout:
|
||||
* * The constant and multiplier component of this timeout condition,
|
||||
* for both read and write, are defined in serial::Timeout. This
|
||||
* timeout occurs if the total time since the read or write call was
|
||||
* made exceeds the specified time in milliseconds.
|
||||
* * The limit is defined by multiplying the multiplier component by the
|
||||
* number of requested bytes and adding that product to the constant
|
||||
* component. In this way if you want a read call, for example, to
|
||||
* timeout after exactly one second regardless of the number of bytes
|
||||
* you asked for then set the read_timeout_constant component of
|
||||
* serial::Timeout to 1000 and the read_timeout_multiplier to zero.
|
||||
* This timeout condition can be used in conjunction with the inter
|
||||
* byte timeout condition with out any problems, timeout will simply
|
||||
* occur when one of the two timeout conditions is met. This allows
|
||||
* users to have maximum control over the trade-off between
|
||||
* responsiveness and efficiency.
|
||||
*
|
||||
* Read and write functions will return in one of three cases. When the
|
||||
* reading or writing is complete, when a timeout occurs, or when an
|
||||
* exception occurs.
|
||||
*
|
||||
* \param timeout A serial::Timeout struct containing the inter byte
|
||||
* timeout, and the read and write timeout constants and multipliers.
|
||||
*
|
||||
* \see serial::Timeout
|
||||
*/
|
||||
void
|
||||
setTimeout (Timeout &timeout);
|
||||
|
||||
/*! Sets the timeout for reads and writes. */
|
||||
void
|
||||
setTimeout (uint32_t inter_byte_timeout, uint32_t read_timeout_constant,
|
||||
uint32_t read_timeout_multiplier, uint32_t write_timeout_constant,
|
||||
uint32_t write_timeout_multiplier)
|
||||
{
|
||||
Timeout timeout(inter_byte_timeout, read_timeout_constant,
|
||||
read_timeout_multiplier, write_timeout_constant,
|
||||
write_timeout_multiplier);
|
||||
return setTimeout(timeout);
|
||||
}
|
||||
|
||||
/*! Gets the timeout for reads in seconds.
|
||||
*
|
||||
* \return A Timeout struct containing the inter_byte_timeout, and read
|
||||
* and write timeout constants and multipliers.
|
||||
*
|
||||
* \see Serial::setTimeout
|
||||
*/
|
||||
Timeout
|
||||
getTimeout () const;
|
||||
|
||||
/*! Sets the baudrate for the serial port.
|
||||
*
|
||||
* Possible baudrates depends on the system but some safe baudrates include:
|
||||
* 110, 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 56000,
|
||||
* 57600, 115200
|
||||
* Some other baudrates that are supported by some comports:
|
||||
* 128000, 153600, 230400, 256000, 460800, 921600
|
||||
*
|
||||
* \param baudrate An integer that sets the baud rate for the serial port.
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setBaudrate (uint32_t baudrate);
|
||||
|
||||
/*! Gets the baudrate for the serial port.
|
||||
*
|
||||
* \return An integer that sets the baud rate for the serial port.
|
||||
*
|
||||
* \see Serial::setBaudrate
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
uint32_t
|
||||
getBaudrate () const;
|
||||
|
||||
/*! Sets the bytesize for the serial port.
|
||||
*
|
||||
* \param bytesize Size of each byte in the serial transmission of data,
|
||||
* default is eightbits, possible values are: fivebits, sixbits, sevenbits,
|
||||
* eightbits
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setBytesize (bytesize_t bytesize);
|
||||
|
||||
/*! Gets the bytesize for the serial port.
|
||||
*
|
||||
* \see Serial::setBytesize
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
bytesize_t
|
||||
getBytesize () const;
|
||||
|
||||
/*! Sets the parity for the serial port.
|
||||
*
|
||||
* \param parity Method of parity, default is parity_none, possible values
|
||||
* are: parity_none, parity_odd, parity_even
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setParity (parity_t parity);
|
||||
|
||||
/*! Gets the parity for the serial port.
|
||||
*
|
||||
* \see Serial::setParity
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
parity_t
|
||||
getParity () const;
|
||||
|
||||
/*! Sets the stopbits for the serial port.
|
||||
*
|
||||
* \param stopbits Number of stop bits used, default is stopbits_one,
|
||||
* possible values are: stopbits_one, stopbits_one_point_five, stopbits_two
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setStopbits (stopbits_t stopbits);
|
||||
|
||||
/*! Gets the stopbits for the serial port.
|
||||
*
|
||||
* \see Serial::setStopbits
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
stopbits_t
|
||||
getStopbits () const;
|
||||
|
||||
/*! Sets the flow control for the serial port.
|
||||
*
|
||||
* \param flowcontrol Type of flowcontrol used, default is flowcontrol_none,
|
||||
* possible values are: flowcontrol_none, flowcontrol_software,
|
||||
* flowcontrol_hardware
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
void
|
||||
setFlowcontrol (flowcontrol_t flowcontrol);
|
||||
|
||||
/*! Gets the flow control for the serial port.
|
||||
*
|
||||
* \see Serial::setFlowcontrol
|
||||
*
|
||||
* \throw std::invalid_argument
|
||||
*/
|
||||
flowcontrol_t
|
||||
getFlowcontrol () const;
|
||||
|
||||
/*! Flush the input and output buffers */
|
||||
void
|
||||
flush ();
|
||||
|
||||
/*! Flush only the input buffer */
|
||||
void
|
||||
flushInput ();
|
||||
|
||||
/*! Flush only the output buffer */
|
||||
void
|
||||
flushOutput ();
|
||||
|
||||
/*! Sends the RS-232 break signal. See tcsendbreak(3). */
|
||||
void
|
||||
sendBreak (int duration);
|
||||
|
||||
/*! Set the break condition to a given level. Defaults to true. */
|
||||
void
|
||||
setBreak (bool level = true);
|
||||
|
||||
/*! Set the RTS handshaking line to the given level. Defaults to true. */
|
||||
void
|
||||
setRTS (bool level = true);
|
||||
|
||||
/*! Set the DTR handshaking line to the given level. Defaults to true. */
|
||||
void
|
||||
setDTR (bool level = true);
|
||||
|
||||
/*!
|
||||
* Blocks until CTS, DSR, RI, CD changes or something interrupts it.
|
||||
*
|
||||
* Can throw an exception if an error occurs while waiting.
|
||||
* You can check the status of CTS, DSR, RI, and CD once this returns.
|
||||
* Uses TIOCMIWAIT via ioctl if available (mostly only on Linux) with a
|
||||
* resolution of less than +-1ms and as good as +-0.2ms. Otherwise a
|
||||
* polling method is used which can give +-2ms.
|
||||
*
|
||||
* \return Returns true if one of the lines changed, false if something else
|
||||
* occurred.
|
||||
*
|
||||
* \throw SerialException
|
||||
*/
|
||||
bool
|
||||
waitForChange ();
|
||||
|
||||
/*! Returns the current status of the CTS line. */
|
||||
bool
|
||||
getCTS ();
|
||||
|
||||
/*! Returns the current status of the DSR line. */
|
||||
bool
|
||||
getDSR ();
|
||||
|
||||
/*! Returns the current status of the RI line. */
|
||||
bool
|
||||
getRI ();
|
||||
|
||||
/*! Returns the current status of the CD line. */
|
||||
bool
|
||||
getCD ();
|
||||
|
||||
private:
|
||||
// Disable copy constructors
|
||||
Serial(const Serial&);
|
||||
Serial& operator=(const Serial&);
|
||||
|
||||
// Pimpl idiom, d_pointer
|
||||
class SerialImpl;
|
||||
SerialImpl *pimpl_;
|
||||
|
||||
// Scoped Lock Classes
|
||||
class ScopedReadLock;
|
||||
class ScopedWriteLock;
|
||||
|
||||
// Read common function
|
||||
size_t
|
||||
read_ (uint8_t *buffer, size_t size);
|
||||
// Write common function
|
||||
size_t
|
||||
write_ (const uint8_t *data, size_t length);
|
||||
|
||||
};
|
||||
|
||||
class SerialException : public std::exception
|
||||
{
|
||||
// Disable copy constructors
|
||||
SerialException& operator=(const SerialException&);
|
||||
std::string e_what_;
|
||||
public:
|
||||
SerialException (const char *description) {
|
||||
std::stringstream ss;
|
||||
ss << "SerialException " << description << " failed.";
|
||||
e_what_ = ss.str();
|
||||
}
|
||||
SerialException (const SerialException& other) : e_what_(other.e_what_) {}
|
||||
virtual ~SerialException() throw() {}
|
||||
virtual const char* what () const throw () {
|
||||
return e_what_.c_str();
|
||||
}
|
||||
};
|
||||
|
||||
class IOException : public std::exception
|
||||
{
|
||||
// Disable copy constructors
|
||||
IOException& operator=(const IOException&);
|
||||
std::string file_;
|
||||
int line_;
|
||||
std::string e_what_;
|
||||
int errno_;
|
||||
public:
|
||||
explicit IOException (std::string file, int line, int errnum)
|
||||
: file_(file), line_(line), errno_(errnum) {
|
||||
std::stringstream ss;
|
||||
#if defined(_WIN32) && !defined(__MINGW32__)
|
||||
char error_str [1024];
|
||||
strerror_s(error_str, 1024, errnum);
|
||||
#else
|
||||
char * error_str = strerror(errnum);
|
||||
#endif
|
||||
ss << "IO Exception (" << errno_ << "): " << error_str;
|
||||
ss << ", file " << file_ << ", line " << line_ << ".";
|
||||
e_what_ = ss.str();
|
||||
}
|
||||
explicit IOException (std::string file, int line, const char * description)
|
||||
: file_(file), line_(line), errno_(0) {
|
||||
std::stringstream ss;
|
||||
ss << "IO Exception: " << description;
|
||||
ss << ", file " << file_ << ", line " << line_ << ".";
|
||||
e_what_ = ss.str();
|
||||
}
|
||||
virtual ~IOException() throw() {}
|
||||
IOException (const IOException& other) : line_(other.line_), e_what_(other.e_what_), errno_(other.errno_) {}
|
||||
|
||||
int getErrorNumber () { return errno_; }
|
||||
|
||||
virtual const char* what () const throw () {
|
||||
return e_what_.c_str();
|
||||
}
|
||||
};
|
||||
|
||||
class PortNotOpenedException : public std::exception
|
||||
{
|
||||
// Disable copy constructors
|
||||
const PortNotOpenedException& operator=(PortNotOpenedException);
|
||||
std::string e_what_;
|
||||
public:
|
||||
PortNotOpenedException (const char * description) {
|
||||
std::stringstream ss;
|
||||
ss << "PortNotOpenedException " << description << " failed.";
|
||||
e_what_ = ss.str();
|
||||
}
|
||||
PortNotOpenedException (const PortNotOpenedException& other) : e_what_(other.e_what_) {}
|
||||
virtual ~PortNotOpenedException() throw() {}
|
||||
virtual const char* what () const throw () {
|
||||
return e_what_.c_str();
|
||||
}
|
||||
};
|
||||
|
||||
/*!
|
||||
* Structure that describes a serial device.
|
||||
*/
|
||||
struct PortInfo {
|
||||
|
||||
/*! Address of the serial port (this can be passed to the constructor of Serial). */
|
||||
std::string port;
|
||||
|
||||
/*! Human readable description of serial device if available. */
|
||||
std::string description;
|
||||
|
||||
/*! Hardware ID (e.g. VID:PID of USB serial devices) or "n/a" if not available. */
|
||||
std::string hardware_id;
|
||||
|
||||
};
|
||||
|
||||
/* Lists the serial ports available on the system
|
||||
*
|
||||
* Returns a vector of available serial ports, each represented
|
||||
* by a serial::PortInfo data structure:
|
||||
*
|
||||
* \return vector of serial::PortInfo.
|
||||
*/
|
||||
std::vector<PortInfo>
|
||||
list_ports();
|
||||
|
||||
} // namespace serial
|
||||
|
||||
#endif
|
||||
@@ -1,57 +0,0 @@
|
||||
// This header is from the v8 google project:
|
||||
// http://code.google.com/p/v8/source/browse/trunk/include/v8stdint.h
|
||||
|
||||
// Copyright 2012 the V8 project authors. All rights reserved.
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are
|
||||
// met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright
|
||||
// notice, this list of conditions and the following disclaimer.
|
||||
// * Redistributions in binary form must reproduce the above
|
||||
// copyright notice, this list of conditions and the following
|
||||
// disclaimer in the documentation and/or other materials provided
|
||||
// with the distribution.
|
||||
// * Neither the name of Google Inc. nor the names of its
|
||||
// contributors may be used to endorse or promote products derived
|
||||
// from this software without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
// Load definitions of standard types.
|
||||
|
||||
#ifndef V8STDINT_H_
|
||||
#define V8STDINT_H_
|
||||
|
||||
#include <stddef.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#if defined(_WIN32) && !defined(__MINGW32__)
|
||||
|
||||
typedef signed char int8_t;
|
||||
typedef unsigned char uint8_t;
|
||||
typedef short int16_t; // NOLINT
|
||||
typedef unsigned short uint16_t; // NOLINT
|
||||
typedef int int32_t;
|
||||
typedef unsigned int uint32_t;
|
||||
typedef __int64 int64_t;
|
||||
typedef unsigned __int64 uint64_t;
|
||||
// intptr_t and friends are defined in crtdefs.h through stdio.h.
|
||||
|
||||
#else
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#endif
|
||||
|
||||
#endif // V8STDINT_H_
|
||||
@@ -1,335 +0,0 @@
|
||||
#if defined(__linux__)
|
||||
|
||||
/*
|
||||
* Copyright (c) 2014 Craig Lilley <cralilley@gmail.com>
|
||||
* This software is made available under the terms of the MIT licence.
|
||||
* A copy of the licence can be obtained from:
|
||||
* http://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <sstream>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <cstdio>
|
||||
#include <cstdarg>
|
||||
#include <cstdlib>
|
||||
|
||||
#include <glob.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <unistd.h>
|
||||
#include "../../../include/serial.h"
|
||||
|
||||
|
||||
using serial::PortInfo;
|
||||
using std::istringstream;
|
||||
using std::ifstream;
|
||||
using std::getline;
|
||||
using std::vector;
|
||||
using std::string;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
static vector<string> glob(const vector<string>& patterns);
|
||||
static string basename(const string& path);
|
||||
static string dirname(const string& path);
|
||||
static bool path_exists(const string& path);
|
||||
static string realpath(const string& path);
|
||||
static string usb_sysfs_friendly_name(const string& sys_usb_path);
|
||||
static vector<string> get_sysfs_info(const string& device_path);
|
||||
static string read_line(const string& file);
|
||||
static string usb_sysfs_hw_string(const string& sysfs_path);
|
||||
static string format(const char* format, ...);
|
||||
|
||||
vector<string>
|
||||
glob(const vector<string>& patterns)
|
||||
{
|
||||
vector<string> paths_found;
|
||||
|
||||
if(patterns.size() == 0)
|
||||
return paths_found;
|
||||
|
||||
glob_t glob_results;
|
||||
|
||||
int glob_retval = glob(patterns[0].c_str(), 0, NULL, &glob_results);
|
||||
|
||||
vector<string>::const_iterator iter = patterns.begin();
|
||||
|
||||
while(++iter != patterns.end())
|
||||
{
|
||||
glob_retval = glob(iter->c_str(), GLOB_APPEND, NULL, &glob_results);
|
||||
}
|
||||
|
||||
for(int path_index = 0; path_index < glob_results.gl_pathc; path_index++)
|
||||
{
|
||||
paths_found.push_back(glob_results.gl_pathv[path_index]);
|
||||
}
|
||||
|
||||
globfree(&glob_results);
|
||||
|
||||
return paths_found;
|
||||
}
|
||||
|
||||
string
|
||||
basename(const string& path)
|
||||
{
|
||||
size_t pos = path.rfind("/");
|
||||
|
||||
if(pos == std::string::npos)
|
||||
return path;
|
||||
|
||||
return string(path, pos+1, string::npos);
|
||||
}
|
||||
|
||||
string
|
||||
dirname(const string& path)
|
||||
{
|
||||
size_t pos = path.rfind("/");
|
||||
|
||||
if(pos == std::string::npos)
|
||||
return path;
|
||||
else if(pos == 0)
|
||||
return "/";
|
||||
|
||||
return string(path, 0, pos);
|
||||
}
|
||||
|
||||
bool
|
||||
path_exists(const string& path)
|
||||
{
|
||||
struct stat sb;
|
||||
|
||||
if( stat(path.c_str(), &sb ) == 0 )
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
string
|
||||
realpath(const string& path)
|
||||
{
|
||||
char* real_path = realpath(path.c_str(), NULL);
|
||||
|
||||
string result;
|
||||
|
||||
if(real_path != NULL)
|
||||
{
|
||||
result = real_path;
|
||||
|
||||
free(real_path);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string
|
||||
usb_sysfs_friendly_name(const string& sys_usb_path)
|
||||
{
|
||||
unsigned int device_number = 0;
|
||||
|
||||
istringstream( read_line(sys_usb_path + "/devnum") ) >> device_number;
|
||||
|
||||
string manufacturer = read_line( sys_usb_path + "/manufacturer" );
|
||||
|
||||
string product = read_line( sys_usb_path + "/product" );
|
||||
|
||||
string serial = read_line( sys_usb_path + "/serial" );
|
||||
|
||||
if( manufacturer.empty() && product.empty() && serial.empty() )
|
||||
return "";
|
||||
|
||||
return format("%s %s %s", manufacturer.c_str(), product.c_str(), serial.c_str() );
|
||||
}
|
||||
|
||||
vector<string>
|
||||
get_sysfs_info(const string& device_path)
|
||||
{
|
||||
string device_name = basename( device_path );
|
||||
|
||||
string friendly_name;
|
||||
|
||||
string hardware_id;
|
||||
|
||||
string sys_device_path = format( "/sys/class/tty/%s/device", device_name.c_str() );
|
||||
|
||||
if( device_name.compare(0,6,"ttyUSB") == 0 )
|
||||
{
|
||||
sys_device_path = dirname( dirname( realpath( sys_device_path ) ) );
|
||||
|
||||
if( path_exists( sys_device_path ) )
|
||||
{
|
||||
friendly_name = usb_sysfs_friendly_name( sys_device_path );
|
||||
|
||||
hardware_id = usb_sysfs_hw_string( sys_device_path );
|
||||
}
|
||||
}
|
||||
else if( device_name.compare(0,6,"ttyACM") == 0 )
|
||||
{
|
||||
sys_device_path = dirname( realpath( sys_device_path ) );
|
||||
|
||||
if( path_exists( sys_device_path ) )
|
||||
{
|
||||
friendly_name = usb_sysfs_friendly_name( sys_device_path );
|
||||
|
||||
hardware_id = usb_sysfs_hw_string( sys_device_path );
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Try to read ID string of PCI device
|
||||
|
||||
string sys_id_path = sys_device_path + "/id";
|
||||
|
||||
if( path_exists( sys_id_path ) )
|
||||
hardware_id = read_line( sys_id_path );
|
||||
}
|
||||
|
||||
if( friendly_name.empty() )
|
||||
friendly_name = device_name;
|
||||
|
||||
if( hardware_id.empty() )
|
||||
hardware_id = "n/a";
|
||||
|
||||
vector<string> result;
|
||||
result.push_back(friendly_name);
|
||||
result.push_back(hardware_id);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string
|
||||
read_line(const string& file)
|
||||
{
|
||||
ifstream ifs(file.c_str(), ifstream::in);
|
||||
|
||||
string line;
|
||||
|
||||
if(ifs)
|
||||
{
|
||||
getline(ifs, line);
|
||||
}
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
string
|
||||
format(const char* format, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
size_t buffer_size_bytes = 256;
|
||||
|
||||
string result;
|
||||
|
||||
char* buffer = (char*)malloc(buffer_size_bytes);
|
||||
|
||||
if( buffer == NULL )
|
||||
return result;
|
||||
|
||||
bool done = false;
|
||||
|
||||
unsigned int loop_count = 0;
|
||||
|
||||
while(!done)
|
||||
{
|
||||
va_start(ap, format);
|
||||
|
||||
int return_value = vsnprintf(buffer, buffer_size_bytes, format, ap);
|
||||
|
||||
if( return_value < 0 )
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
else if( return_value >= buffer_size_bytes )
|
||||
{
|
||||
// Realloc and try again.
|
||||
|
||||
buffer_size_bytes = return_value + 1;
|
||||
|
||||
char* new_buffer_ptr = (char*)realloc(buffer, buffer_size_bytes);
|
||||
|
||||
if( new_buffer_ptr == NULL )
|
||||
{
|
||||
done = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
buffer = new_buffer_ptr;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
result = buffer;
|
||||
done = true;
|
||||
}
|
||||
|
||||
va_end(ap);
|
||||
|
||||
if( ++loop_count > 5 )
|
||||
done = true;
|
||||
}
|
||||
|
||||
free(buffer);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string
|
||||
usb_sysfs_hw_string(const string& sysfs_path)
|
||||
{
|
||||
string serial_number = read_line( sysfs_path + "/serial" );
|
||||
|
||||
if( serial_number.length() > 0 )
|
||||
{
|
||||
serial_number = format( "SNR=%s", serial_number.c_str() );
|
||||
}
|
||||
|
||||
string vid = read_line( sysfs_path + "/idVendor" );
|
||||
|
||||
string pid = read_line( sysfs_path + "/idProduct" );
|
||||
|
||||
return format("USB VID:PID=%s:%s %s", vid.c_str(), pid.c_str(), serial_number.c_str() );
|
||||
}
|
||||
|
||||
vector<PortInfo>
|
||||
serial::list_ports()
|
||||
{
|
||||
vector<PortInfo> results;
|
||||
|
||||
vector<string> search_globs;
|
||||
search_globs.push_back("/dev/ttyACM*");
|
||||
search_globs.push_back("/dev/ttyS*");
|
||||
search_globs.push_back("/dev/ttyUSB*");
|
||||
search_globs.push_back("/dev/tty.*");
|
||||
search_globs.push_back("/dev/cu.*");
|
||||
|
||||
vector<string> devices_found = glob( search_globs );
|
||||
|
||||
vector<string>::iterator iter = devices_found.begin();
|
||||
|
||||
while( iter != devices_found.end() )
|
||||
{
|
||||
string device = *iter++;
|
||||
|
||||
vector<string> sysfs_info = get_sysfs_info( device );
|
||||
|
||||
string friendly_name = sysfs_info[0];
|
||||
|
||||
string hardware_id = sysfs_info[1];
|
||||
|
||||
PortInfo device_entry;
|
||||
device_entry.port = device;
|
||||
device_entry.description = friendly_name;
|
||||
device_entry.hardware_id = hardware_id;
|
||||
|
||||
results.push_back( device_entry );
|
||||
|
||||
}
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
#endif // defined(__linux__)
|
||||
@@ -1,286 +0,0 @@
|
||||
#if defined(__APPLE__)
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <stdint.h>
|
||||
|
||||
#include <CoreFoundation/CoreFoundation.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/serial/IOSerialKeys.h>
|
||||
#include <IOKit/IOBSD.h>
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "serial/serial.h"
|
||||
|
||||
using serial::PortInfo;
|
||||
using std::string;
|
||||
using std::vector;
|
||||
|
||||
#define HARDWARE_ID_STRING_LENGTH 128
|
||||
|
||||
string cfstring_to_string( CFStringRef cfstring );
|
||||
string get_device_path( io_object_t& serial_port );
|
||||
string get_class_name( io_object_t& obj );
|
||||
io_registry_entry_t get_parent_iousb_device( io_object_t& serial_port );
|
||||
string get_string_property( io_object_t& device, const char* property );
|
||||
uint16_t get_int_property( io_object_t& device, const char* property );
|
||||
string rtrim(const string& str);
|
||||
|
||||
string
|
||||
cfstring_to_string( CFStringRef cfstring )
|
||||
{
|
||||
char cstring[MAXPATHLEN];
|
||||
string result;
|
||||
|
||||
if( cfstring )
|
||||
{
|
||||
Boolean success = CFStringGetCString( cfstring,
|
||||
cstring,
|
||||
sizeof(cstring),
|
||||
kCFStringEncodingASCII );
|
||||
|
||||
if( success )
|
||||
result = cstring;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string
|
||||
get_device_path( io_object_t& serial_port )
|
||||
{
|
||||
CFTypeRef callout_path;
|
||||
string device_path;
|
||||
|
||||
callout_path = IORegistryEntryCreateCFProperty( serial_port,
|
||||
CFSTR(kIOCalloutDeviceKey),
|
||||
kCFAllocatorDefault,
|
||||
0 );
|
||||
|
||||
if (callout_path)
|
||||
{
|
||||
if( CFGetTypeID(callout_path) == CFStringGetTypeID() )
|
||||
device_path = cfstring_to_string( static_cast<CFStringRef>(callout_path) );
|
||||
|
||||
CFRelease(callout_path);
|
||||
}
|
||||
|
||||
return device_path;
|
||||
}
|
||||
|
||||
string
|
||||
get_class_name( io_object_t& obj )
|
||||
{
|
||||
string result;
|
||||
io_name_t class_name;
|
||||
kern_return_t kern_result;
|
||||
|
||||
kern_result = IOObjectGetClass( obj, class_name );
|
||||
|
||||
if( kern_result == KERN_SUCCESS )
|
||||
result = class_name;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
io_registry_entry_t
|
||||
get_parent_iousb_device( io_object_t& serial_port )
|
||||
{
|
||||
io_object_t device = serial_port;
|
||||
io_registry_entry_t parent = 0;
|
||||
io_registry_entry_t result = 0;
|
||||
kern_return_t kern_result = KERN_FAILURE;
|
||||
string name = get_class_name(device);
|
||||
|
||||
// Walk the IO Registry tree looking for this devices parent IOUSBDevice.
|
||||
while( name != "IOUSBDevice" )
|
||||
{
|
||||
kern_result = IORegistryEntryGetParentEntry( device,
|
||||
kIOServicePlane,
|
||||
&parent );
|
||||
|
||||
if(kern_result != KERN_SUCCESS)
|
||||
{
|
||||
result = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
device = parent;
|
||||
|
||||
name = get_class_name(device);
|
||||
}
|
||||
|
||||
if(kern_result == KERN_SUCCESS)
|
||||
result = device;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string
|
||||
get_string_property( io_object_t& device, const char* property )
|
||||
{
|
||||
string property_name;
|
||||
|
||||
if( device )
|
||||
{
|
||||
CFStringRef property_as_cfstring = CFStringCreateWithCString (
|
||||
kCFAllocatorDefault,
|
||||
property,
|
||||
kCFStringEncodingASCII );
|
||||
|
||||
CFTypeRef name_as_cfstring = IORegistryEntryCreateCFProperty(
|
||||
device,
|
||||
property_as_cfstring,
|
||||
kCFAllocatorDefault,
|
||||
0 );
|
||||
|
||||
if( name_as_cfstring )
|
||||
{
|
||||
if( CFGetTypeID(name_as_cfstring) == CFStringGetTypeID() )
|
||||
property_name = cfstring_to_string( static_cast<CFStringRef>(name_as_cfstring) );
|
||||
|
||||
CFRelease(name_as_cfstring);
|
||||
}
|
||||
|
||||
if(property_as_cfstring)
|
||||
CFRelease(property_as_cfstring);
|
||||
}
|
||||
|
||||
return property_name;
|
||||
}
|
||||
|
||||
uint16_t
|
||||
get_int_property( io_object_t& device, const char* property )
|
||||
{
|
||||
uint16_t result = 0;
|
||||
|
||||
if( device )
|
||||
{
|
||||
CFStringRef property_as_cfstring = CFStringCreateWithCString (
|
||||
kCFAllocatorDefault,
|
||||
property,
|
||||
kCFStringEncodingASCII );
|
||||
|
||||
CFTypeRef number = IORegistryEntryCreateCFProperty( device,
|
||||
property_as_cfstring,
|
||||
kCFAllocatorDefault,
|
||||
0 );
|
||||
|
||||
if(property_as_cfstring)
|
||||
CFRelease(property_as_cfstring);
|
||||
|
||||
if( number )
|
||||
{
|
||||
if( CFGetTypeID(number) == CFNumberGetTypeID() )
|
||||
{
|
||||
bool success = CFNumberGetValue( static_cast<CFNumberRef>(number),
|
||||
kCFNumberSInt16Type,
|
||||
&result );
|
||||
|
||||
if( !success )
|
||||
result = 0;
|
||||
}
|
||||
|
||||
CFRelease(number);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
string rtrim(const string& str)
|
||||
{
|
||||
string result = str;
|
||||
|
||||
string whitespace = " \t\f\v\n\r";
|
||||
|
||||
std::size_t found = result.find_last_not_of(whitespace);
|
||||
|
||||
if (found != std::string::npos)
|
||||
result.erase(found+1);
|
||||
else
|
||||
result.clear();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
vector<PortInfo>
|
||||
serial::list_ports(void)
|
||||
{
|
||||
vector<PortInfo> devices_found;
|
||||
CFMutableDictionaryRef classes_to_match;
|
||||
io_iterator_t serial_port_iterator;
|
||||
io_object_t serial_port;
|
||||
mach_port_t master_port;
|
||||
kern_return_t kern_result;
|
||||
|
||||
kern_result = IOMasterPort(MACH_PORT_NULL, &master_port);
|
||||
|
||||
if(kern_result != KERN_SUCCESS)
|
||||
return devices_found;
|
||||
|
||||
classes_to_match = IOServiceMatching(kIOSerialBSDServiceValue);
|
||||
|
||||
if (classes_to_match == NULL)
|
||||
return devices_found;
|
||||
|
||||
CFDictionarySetValue( classes_to_match,
|
||||
CFSTR(kIOSerialBSDTypeKey),
|
||||
CFSTR(kIOSerialBSDAllTypes) );
|
||||
|
||||
kern_result = IOServiceGetMatchingServices(master_port, classes_to_match, &serial_port_iterator);
|
||||
|
||||
if (KERN_SUCCESS != kern_result)
|
||||
return devices_found;
|
||||
|
||||
while ( (serial_port = IOIteratorNext(serial_port_iterator)) )
|
||||
{
|
||||
string device_path = get_device_path( serial_port );
|
||||
io_registry_entry_t parent = get_parent_iousb_device( serial_port );
|
||||
IOObjectRelease(serial_port);
|
||||
|
||||
if( device_path.empty() )
|
||||
continue;
|
||||
|
||||
PortInfo port_info;
|
||||
port_info.port = device_path;
|
||||
port_info.description = "n/a";
|
||||
port_info.hardware_id = "n/a";
|
||||
|
||||
string device_name = rtrim( get_string_property( parent, "USB Product Name" ) );
|
||||
string vendor_name = rtrim( get_string_property( parent, "USB Vendor Name") );
|
||||
string description = rtrim( vendor_name + " " + device_name );
|
||||
if( !description.empty() )
|
||||
port_info.description = description;
|
||||
|
||||
string serial_number = rtrim(get_string_property( parent, "USB Serial Number" ) );
|
||||
uint16_t vendor_id = get_int_property( parent, "idVendor" );
|
||||
uint16_t product_id = get_int_property( parent, "idProduct" );
|
||||
|
||||
if( vendor_id && product_id )
|
||||
{
|
||||
char cstring[HARDWARE_ID_STRING_LENGTH];
|
||||
|
||||
if(serial_number.empty())
|
||||
serial_number = "None";
|
||||
|
||||
int ret = snprintf( cstring, HARDWARE_ID_STRING_LENGTH, "USB VID:PID=%04x:%04x SNR=%s",
|
||||
vendor_id,
|
||||
product_id,
|
||||
serial_number.c_str() );
|
||||
|
||||
if( (ret >= 0) && (ret < HARDWARE_ID_STRING_LENGTH) )
|
||||
port_info.hardware_id = cstring;
|
||||
}
|
||||
|
||||
devices_found.push_back(port_info);
|
||||
}
|
||||
|
||||
IOObjectRelease(serial_port_iterator);
|
||||
return devices_found;
|
||||
}
|
||||
|
||||
#endif // defined(__APPLE__)
|
||||
@@ -1,152 +0,0 @@
|
||||
#if defined(_WIN32)
|
||||
|
||||
/*
|
||||
* Copyright (c) 2014 Craig Lilley <cralilley@gmail.com>
|
||||
* This software is made available under the terms of the MIT licence.
|
||||
* A copy of the licence can be obtained from:
|
||||
* http://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#include "include/serial.h"
|
||||
#include <tchar.h>
|
||||
#include <windows.h>
|
||||
#include <setupapi.h>
|
||||
#include <initguid.h>
|
||||
#include <devguid.h>
|
||||
#include <cstring>
|
||||
|
||||
using serial::PortInfo;
|
||||
using std::vector;
|
||||
using std::string;
|
||||
|
||||
static const DWORD port_name_max_length = 256;
|
||||
static const DWORD friendly_name_max_length = 256;
|
||||
static const DWORD hardware_id_max_length = 256;
|
||||
|
||||
// Convert a wide Unicode string to an UTF8 string
|
||||
std::string utf8_encode(const std::wstring &wstr)
|
||||
{
|
||||
int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL);
|
||||
std::string strTo( size_needed, 0 );
|
||||
WideCharToMultiByte (CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL);
|
||||
return strTo;
|
||||
}
|
||||
|
||||
vector<PortInfo>
|
||||
serial::list_ports()
|
||||
{
|
||||
vector<PortInfo> devices_found;
|
||||
|
||||
HDEVINFO device_info_set = SetupDiGetClassDevs(
|
||||
(const GUID *) &GUID_DEVCLASS_PORTS,
|
||||
NULL,
|
||||
NULL,
|
||||
DIGCF_PRESENT);
|
||||
|
||||
unsigned int device_info_set_index = 0;
|
||||
SP_DEVINFO_DATA device_info_data;
|
||||
|
||||
device_info_data.cbSize = sizeof(SP_DEVINFO_DATA);
|
||||
|
||||
while(SetupDiEnumDeviceInfo(device_info_set, device_info_set_index, &device_info_data))
|
||||
{
|
||||
device_info_set_index++;
|
||||
|
||||
// Get port name
|
||||
|
||||
HKEY hkey = SetupDiOpenDevRegKey(
|
||||
device_info_set,
|
||||
&device_info_data,
|
||||
DICS_FLAG_GLOBAL,
|
||||
0,
|
||||
DIREG_DEV,
|
||||
KEY_READ);
|
||||
|
||||
TCHAR port_name[port_name_max_length];
|
||||
DWORD port_name_length = port_name_max_length;
|
||||
|
||||
LONG return_code = RegQueryValueEx(
|
||||
hkey,
|
||||
_T("PortName"),
|
||||
NULL,
|
||||
NULL,
|
||||
(LPBYTE)port_name,
|
||||
&port_name_length);
|
||||
|
||||
RegCloseKey(hkey);
|
||||
|
||||
if(return_code != EXIT_SUCCESS)
|
||||
continue;
|
||||
|
||||
if(port_name_length > 0 && port_name_length <= port_name_max_length)
|
||||
port_name[port_name_length-1] = '\0';
|
||||
else
|
||||
port_name[0] = '\0';
|
||||
|
||||
// Ignore parallel ports
|
||||
|
||||
if(_tcsstr(port_name, _T("LPT")) != NULL)
|
||||
continue;
|
||||
|
||||
// Get port friendly name
|
||||
|
||||
TCHAR friendly_name[friendly_name_max_length];
|
||||
DWORD friendly_name_actual_length = 0;
|
||||
|
||||
BOOL got_friendly_name = SetupDiGetDeviceRegistryProperty(
|
||||
device_info_set,
|
||||
&device_info_data,
|
||||
SPDRP_FRIENDLYNAME,
|
||||
NULL,
|
||||
(PBYTE)friendly_name,
|
||||
friendly_name_max_length,
|
||||
&friendly_name_actual_length);
|
||||
|
||||
if(got_friendly_name == TRUE && friendly_name_actual_length > 0)
|
||||
friendly_name[friendly_name_actual_length-1] = '\0';
|
||||
else
|
||||
friendly_name[0] = '\0';
|
||||
|
||||
// Get hardware ID
|
||||
|
||||
TCHAR hardware_id[hardware_id_max_length];
|
||||
DWORD hardware_id_actual_length = 0;
|
||||
|
||||
BOOL got_hardware_id = SetupDiGetDeviceRegistryProperty(
|
||||
device_info_set,
|
||||
&device_info_data,
|
||||
SPDRP_HARDWAREID,
|
||||
NULL,
|
||||
(PBYTE)hardware_id,
|
||||
hardware_id_max_length,
|
||||
&hardware_id_actual_length);
|
||||
|
||||
if(got_hardware_id == TRUE && hardware_id_actual_length > 0)
|
||||
hardware_id[hardware_id_actual_length-1] = '\0';
|
||||
else
|
||||
hardware_id[0] = '\0';
|
||||
|
||||
#ifdef UNICODE
|
||||
std::string portName = utf8_encode(port_name);
|
||||
std::string friendlyName = utf8_encode(friendly_name);
|
||||
std::string hardwareId = utf8_encode(hardware_id);
|
||||
#else
|
||||
std::string portName = port_name;
|
||||
std::string friendlyName = friendly_name;
|
||||
std::string hardwareId = hardware_id;
|
||||
#endif
|
||||
|
||||
PortInfo port_entry;
|
||||
port_entry.port = portName;
|
||||
port_entry.description = friendlyName;
|
||||
port_entry.hardware_id = hardwareId;
|
||||
|
||||
devices_found.push_back(port_entry);
|
||||
}
|
||||
|
||||
SetupDiDestroyDeviceInfoList(device_info_set);
|
||||
|
||||
return devices_found;
|
||||
}
|
||||
|
||||
#endif // #if defined(_WIN32)
|
||||
@@ -1,640 +0,0 @@
|
||||
#if defined(_WIN32)
|
||||
|
||||
/* Copyright 2012 William Woodall and John Harrison */
|
||||
|
||||
#include <sstream>
|
||||
|
||||
#include "include/impl/win.h"
|
||||
|
||||
using std::string;
|
||||
using std::wstring;
|
||||
using std::stringstream;
|
||||
using std::invalid_argument;
|
||||
using serial::Serial;
|
||||
using serial::Timeout;
|
||||
using serial::bytesize_t;
|
||||
using serial::parity_t;
|
||||
using serial::stopbits_t;
|
||||
using serial::flowcontrol_t;
|
||||
using serial::SerialException;
|
||||
using serial::PortNotOpenedException;
|
||||
using serial::IOException;
|
||||
|
||||
inline wstring
|
||||
_prefix_port_if_needed(const wstring &input)
|
||||
{
|
||||
static wstring windows_com_port_prefix = L"\\\\.\\";
|
||||
if (input.compare(windows_com_port_prefix) != 0)
|
||||
{
|
||||
return windows_com_port_prefix + input;
|
||||
}
|
||||
return input;
|
||||
}
|
||||
|
||||
Serial::SerialImpl::SerialImpl (const string &port, unsigned long baudrate,
|
||||
bytesize_t bytesize,
|
||||
parity_t parity, stopbits_t stopbits,
|
||||
flowcontrol_t flowcontrol)
|
||||
: port_ (port.begin(), port.end()), fd_ (INVALID_HANDLE_VALUE), is_open_ (false),
|
||||
baudrate_ (baudrate), parity_ (parity),
|
||||
bytesize_ (bytesize), stopbits_ (stopbits), flowcontrol_ (flowcontrol)
|
||||
{
|
||||
read_mutex = CreateMutex(NULL, false, NULL);
|
||||
write_mutex = CreateMutex(NULL, false, NULL);
|
||||
if (port_.empty () == false)
|
||||
open ();
|
||||
}
|
||||
|
||||
Serial::SerialImpl::~SerialImpl ()
|
||||
{
|
||||
this->close();
|
||||
CloseHandle(read_mutex);
|
||||
CloseHandle(write_mutex);
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::open ()
|
||||
{
|
||||
if (port_.empty ()) {
|
||||
throw invalid_argument ("Empty port is invalid.");
|
||||
}
|
||||
if (is_open_ == true) {
|
||||
throw SerialException ("Serial port already open.");
|
||||
}
|
||||
|
||||
// See: https://github.com/wjwwood/serial/issues/84
|
||||
wstring port_with_prefix = _prefix_port_if_needed(port_);
|
||||
LPCWSTR lp_port = port_with_prefix.c_str();
|
||||
fd_ = CreateFileW(lp_port,
|
||||
GENERIC_READ | GENERIC_WRITE,
|
||||
0,
|
||||
0,
|
||||
OPEN_EXISTING,
|
||||
FILE_ATTRIBUTE_NORMAL,
|
||||
0);
|
||||
|
||||
if (fd_ == INVALID_HANDLE_VALUE) {
|
||||
DWORD errno_ = GetLastError();
|
||||
stringstream ss;
|
||||
switch (errno_) {
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
// Use this->getPort to convert to a std::string
|
||||
ss << "Specified port, " << this->getPort() << ", does not exist.";
|
||||
THROW (IOException, ss.str().c_str());
|
||||
default:
|
||||
ss << "Unknown error opening the serial port: " << errno;
|
||||
THROW (IOException, ss.str().c_str());
|
||||
}
|
||||
}
|
||||
|
||||
reconfigurePort();
|
||||
is_open_ = true;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::reconfigurePort ()
|
||||
{
|
||||
if (fd_ == INVALID_HANDLE_VALUE) {
|
||||
// Can only operate on a valid file descriptor
|
||||
THROW (IOException, "Invalid file descriptor, is the serial port open?");
|
||||
}
|
||||
|
||||
DCB dcbSerialParams = {0};
|
||||
|
||||
dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
|
||||
|
||||
if (!GetCommState(fd_, &dcbSerialParams)) {
|
||||
//error getting state
|
||||
THROW (IOException, "Error getting the serial port state.");
|
||||
}
|
||||
|
||||
// setup baud rate
|
||||
switch (baudrate_) {
|
||||
#ifdef CBR_0
|
||||
case 0: dcbSerialParams.BaudRate = CBR_0; break;
|
||||
#endif
|
||||
#ifdef CBR_50
|
||||
case 50: dcbSerialParams.BaudRate = CBR_50; break;
|
||||
#endif
|
||||
#ifdef CBR_75
|
||||
case 75: dcbSerialParams.BaudRate = CBR_75; break;
|
||||
#endif
|
||||
#ifdef CBR_110
|
||||
case 110: dcbSerialParams.BaudRate = CBR_110; break;
|
||||
#endif
|
||||
#ifdef CBR_134
|
||||
case 134: dcbSerialParams.BaudRate = CBR_134; break;
|
||||
#endif
|
||||
#ifdef CBR_150
|
||||
case 150: dcbSerialParams.BaudRate = CBR_150; break;
|
||||
#endif
|
||||
#ifdef CBR_200
|
||||
case 200: dcbSerialParams.BaudRate = CBR_200; break;
|
||||
#endif
|
||||
#ifdef CBR_300
|
||||
case 300: dcbSerialParams.BaudRate = CBR_300; break;
|
||||
#endif
|
||||
#ifdef CBR_600
|
||||
case 600: dcbSerialParams.BaudRate = CBR_600; break;
|
||||
#endif
|
||||
#ifdef CBR_1200
|
||||
case 1200: dcbSerialParams.BaudRate = CBR_1200; break;
|
||||
#endif
|
||||
#ifdef CBR_1800
|
||||
case 1800: dcbSerialParams.BaudRate = CBR_1800; break;
|
||||
#endif
|
||||
#ifdef CBR_2400
|
||||
case 2400: dcbSerialParams.BaudRate = CBR_2400; break;
|
||||
#endif
|
||||
#ifdef CBR_4800
|
||||
case 4800: dcbSerialParams.BaudRate = CBR_4800; break;
|
||||
#endif
|
||||
#ifdef CBR_7200
|
||||
case 7200: dcbSerialParams.BaudRate = CBR_7200; break;
|
||||
#endif
|
||||
#ifdef CBR_9600
|
||||
case 9600: dcbSerialParams.BaudRate = CBR_9600; break;
|
||||
#endif
|
||||
#ifdef CBR_14400
|
||||
case 14400: dcbSerialParams.BaudRate = CBR_14400; break;
|
||||
#endif
|
||||
#ifdef CBR_19200
|
||||
case 19200: dcbSerialParams.BaudRate = CBR_19200; break;
|
||||
#endif
|
||||
#ifdef CBR_28800
|
||||
case 28800: dcbSerialParams.BaudRate = CBR_28800; break;
|
||||
#endif
|
||||
#ifdef CBR_57600
|
||||
case 57600: dcbSerialParams.BaudRate = CBR_57600; break;
|
||||
#endif
|
||||
#ifdef CBR_76800
|
||||
case 76800: dcbSerialParams.BaudRate = CBR_76800; break;
|
||||
#endif
|
||||
#ifdef CBR_38400
|
||||
case 38400: dcbSerialParams.BaudRate = CBR_38400; break;
|
||||
#endif
|
||||
#ifdef CBR_115200
|
||||
case 115200: dcbSerialParams.BaudRate = CBR_115200; break;
|
||||
#endif
|
||||
#ifdef CBR_128000
|
||||
case 128000: dcbSerialParams.BaudRate = CBR_128000; break;
|
||||
#endif
|
||||
#ifdef CBR_153600
|
||||
case 153600: dcbSerialParams.BaudRate = CBR_153600; break;
|
||||
#endif
|
||||
#ifdef CBR_230400
|
||||
case 230400: dcbSerialParams.BaudRate = CBR_230400; break;
|
||||
#endif
|
||||
#ifdef CBR_256000
|
||||
case 256000: dcbSerialParams.BaudRate = CBR_256000; break;
|
||||
#endif
|
||||
#ifdef CBR_460800
|
||||
case 460800: dcbSerialParams.BaudRate = CBR_460800; break;
|
||||
#endif
|
||||
#ifdef CBR_921600
|
||||
case 921600: dcbSerialParams.BaudRate = CBR_921600; break;
|
||||
#endif
|
||||
default:
|
||||
// Try to blindly assign it
|
||||
dcbSerialParams.BaudRate = baudrate_;
|
||||
}
|
||||
|
||||
// setup char len
|
||||
if (bytesize_ == eightbits)
|
||||
dcbSerialParams.ByteSize = 8;
|
||||
else if (bytesize_ == sevenbits)
|
||||
dcbSerialParams.ByteSize = 7;
|
||||
else if (bytesize_ == sixbits)
|
||||
dcbSerialParams.ByteSize = 6;
|
||||
else if (bytesize_ == fivebits)
|
||||
dcbSerialParams.ByteSize = 5;
|
||||
else
|
||||
throw invalid_argument ("invalid char len");
|
||||
|
||||
// setup stopbits
|
||||
if (stopbits_ == stopbits_one)
|
||||
dcbSerialParams.StopBits = ONESTOPBIT;
|
||||
else if (stopbits_ == stopbits_one_point_five)
|
||||
dcbSerialParams.StopBits = ONE5STOPBITS;
|
||||
else if (stopbits_ == stopbits_two)
|
||||
dcbSerialParams.StopBits = TWOSTOPBITS;
|
||||
else
|
||||
throw invalid_argument ("invalid stop bit");
|
||||
|
||||
// setup parity
|
||||
if (parity_ == parity_none) {
|
||||
dcbSerialParams.Parity = NOPARITY;
|
||||
} else if (parity_ == parity_even) {
|
||||
dcbSerialParams.Parity = EVENPARITY;
|
||||
} else if (parity_ == parity_odd) {
|
||||
dcbSerialParams.Parity = ODDPARITY;
|
||||
} else if (parity_ == parity_mark) {
|
||||
dcbSerialParams.Parity = MARKPARITY;
|
||||
} else if (parity_ == parity_space) {
|
||||
dcbSerialParams.Parity = SPACEPARITY;
|
||||
} else {
|
||||
throw invalid_argument ("invalid parity");
|
||||
}
|
||||
|
||||
// setup flowcontrol
|
||||
if (flowcontrol_ == flowcontrol_none) {
|
||||
dcbSerialParams.fOutxCtsFlow = false;
|
||||
dcbSerialParams.fRtsControl = 0x00;
|
||||
dcbSerialParams.fOutX = false;
|
||||
dcbSerialParams.fInX = false;
|
||||
}
|
||||
if (flowcontrol_ == flowcontrol_software) {
|
||||
dcbSerialParams.fOutxCtsFlow = false;
|
||||
dcbSerialParams.fRtsControl = 0x00;
|
||||
dcbSerialParams.fOutX = true;
|
||||
dcbSerialParams.fInX = true;
|
||||
}
|
||||
if (flowcontrol_ == flowcontrol_hardware) {
|
||||
dcbSerialParams.fOutxCtsFlow = true;
|
||||
dcbSerialParams.fRtsControl = 0x03;
|
||||
dcbSerialParams.fOutX = false;
|
||||
dcbSerialParams.fInX = false;
|
||||
}
|
||||
|
||||
// activate settings
|
||||
if (!SetCommState(fd_, &dcbSerialParams)){
|
||||
CloseHandle(fd_);
|
||||
THROW (IOException, "Error setting serial port settings.");
|
||||
}
|
||||
|
||||
// Setup timeouts
|
||||
COMMTIMEOUTS timeouts = {0};
|
||||
timeouts.ReadIntervalTimeout = timeout_.inter_byte_timeout;
|
||||
timeouts.ReadTotalTimeoutConstant = timeout_.read_timeout_constant;
|
||||
timeouts.ReadTotalTimeoutMultiplier = timeout_.read_timeout_multiplier;
|
||||
timeouts.WriteTotalTimeoutConstant = timeout_.write_timeout_constant;
|
||||
timeouts.WriteTotalTimeoutMultiplier = timeout_.write_timeout_multiplier;
|
||||
if (!SetCommTimeouts(fd_, &timeouts)) {
|
||||
THROW (IOException, "Error setting timeouts.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::close ()
|
||||
{
|
||||
if (is_open_ == true) {
|
||||
if (fd_ != INVALID_HANDLE_VALUE) {
|
||||
int ret;
|
||||
ret = CloseHandle(fd_);
|
||||
if (ret == 0) {
|
||||
stringstream ss;
|
||||
ss << "Error while closing serial port: " << GetLastError();
|
||||
THROW (IOException, ss.str().c_str());
|
||||
} else {
|
||||
fd_ = INVALID_HANDLE_VALUE;
|
||||
}
|
||||
}
|
||||
is_open_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::isOpen () const
|
||||
{
|
||||
return is_open_;
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::SerialImpl::available ()
|
||||
{
|
||||
if (!is_open_) {
|
||||
return 0;
|
||||
}
|
||||
COMSTAT cs;
|
||||
if (!ClearCommError(fd_, NULL, &cs)) {
|
||||
stringstream ss;
|
||||
ss << "Error while checking status of the serial port: " << GetLastError();
|
||||
THROW (IOException, ss.str().c_str());
|
||||
}
|
||||
return static_cast<size_t>(cs.cbInQue);
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::waitReadable (uint32_t /*timeout*/)
|
||||
{
|
||||
THROW (IOException, "waitReadable is not implemented on Windows.");
|
||||
return false;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::waitByteTimes (size_t /*count*/)
|
||||
{
|
||||
THROW (IOException, "waitByteTimes is not implemented on Windows.");
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::SerialImpl::read (uint8_t *buf, size_t size)
|
||||
{
|
||||
if (!is_open_) {
|
||||
throw PortNotOpenedException ("Serial::read");
|
||||
}
|
||||
DWORD bytes_read;
|
||||
if (!ReadFile(fd_, buf, static_cast<DWORD>(size), &bytes_read, NULL)) {
|
||||
stringstream ss;
|
||||
ss << "Error while reading from the serial port: " << GetLastError();
|
||||
THROW (IOException, ss.str().c_str());
|
||||
}
|
||||
return (size_t) (bytes_read);
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::SerialImpl::write (const uint8_t *data, size_t length)
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::write");
|
||||
}
|
||||
DWORD bytes_written;
|
||||
if (!WriteFile(fd_, data, static_cast<DWORD>(length), &bytes_written, NULL)) {
|
||||
stringstream ss;
|
||||
ss << "Error while writing to the serial port: " << GetLastError();
|
||||
THROW (IOException, ss.str().c_str());
|
||||
}
|
||||
return (size_t) (bytes_written);
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setPort (const string &port)
|
||||
{
|
||||
port_ = wstring(port.begin(), port.end());
|
||||
}
|
||||
|
||||
string
|
||||
Serial::SerialImpl::getPort () const
|
||||
{
|
||||
return string(port_.begin(), port_.end());
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setTimeout (serial::Timeout &timeout)
|
||||
{
|
||||
timeout_ = timeout;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
serial::Timeout
|
||||
Serial::SerialImpl::getTimeout () const
|
||||
{
|
||||
return timeout_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setBaudrate (unsigned long baudrate)
|
||||
{
|
||||
baudrate_ = baudrate;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
unsigned long
|
||||
Serial::SerialImpl::getBaudrate () const
|
||||
{
|
||||
return baudrate_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setBytesize (serial::bytesize_t bytesize)
|
||||
{
|
||||
bytesize_ = bytesize;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
serial::bytesize_t
|
||||
Serial::SerialImpl::getBytesize () const
|
||||
{
|
||||
return bytesize_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setParity (serial::parity_t parity)
|
||||
{
|
||||
parity_ = parity;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
serial::parity_t
|
||||
Serial::SerialImpl::getParity () const
|
||||
{
|
||||
return parity_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setStopbits (serial::stopbits_t stopbits)
|
||||
{
|
||||
stopbits_ = stopbits;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
serial::stopbits_t
|
||||
Serial::SerialImpl::getStopbits () const
|
||||
{
|
||||
return stopbits_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setFlowcontrol (serial::flowcontrol_t flowcontrol)
|
||||
{
|
||||
flowcontrol_ = flowcontrol;
|
||||
if (is_open_) {
|
||||
reconfigurePort ();
|
||||
}
|
||||
}
|
||||
|
||||
serial::flowcontrol_t
|
||||
Serial::SerialImpl::getFlowcontrol () const
|
||||
{
|
||||
return flowcontrol_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::flush ()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::flush");
|
||||
}
|
||||
FlushFileBuffers (fd_);
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::flushInput ()
|
||||
{
|
||||
THROW (IOException, "flushInput is not supported on Windows.");
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::flushOutput ()
|
||||
{
|
||||
THROW (IOException, "flushOutput is not supported on Windows.");
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::sendBreak (int /*duration*/)
|
||||
{
|
||||
THROW (IOException, "sendBreak is not supported on Windows.");
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setBreak (bool level)
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::setBreak");
|
||||
}
|
||||
if (level) {
|
||||
EscapeCommFunction (fd_, SETBREAK);
|
||||
} else {
|
||||
EscapeCommFunction (fd_, CLRBREAK);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setRTS (bool level)
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::setRTS");
|
||||
}
|
||||
if (level) {
|
||||
EscapeCommFunction (fd_, SETRTS);
|
||||
} else {
|
||||
EscapeCommFunction (fd_, CLRRTS);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::setDTR (bool level)
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::setDTR");
|
||||
}
|
||||
if (level) {
|
||||
EscapeCommFunction (fd_, SETDTR);
|
||||
} else {
|
||||
EscapeCommFunction (fd_, CLRDTR);
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::waitForChange ()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::waitForChange");
|
||||
}
|
||||
DWORD dwCommEvent;
|
||||
|
||||
if (!SetCommMask(fd_, EV_CTS | EV_DSR | EV_RING | EV_RLSD)) {
|
||||
// Error setting communications mask
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!WaitCommEvent(fd_, &dwCommEvent, NULL)) {
|
||||
// An error occurred waiting for the event.
|
||||
return false;
|
||||
} else {
|
||||
// Event has occurred.
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::getCTS ()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::getCTS");
|
||||
}
|
||||
DWORD dwModemStatus;
|
||||
if (!GetCommModemStatus(fd_, &dwModemStatus)) {
|
||||
THROW (IOException, "Error getting the status of the CTS line.");
|
||||
}
|
||||
|
||||
return (MS_CTS_ON & dwModemStatus) != 0;
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::getDSR ()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::getDSR");
|
||||
}
|
||||
DWORD dwModemStatus;
|
||||
if (!GetCommModemStatus(fd_, &dwModemStatus)) {
|
||||
THROW (IOException, "Error getting the status of the DSR line.");
|
||||
}
|
||||
|
||||
return (MS_DSR_ON & dwModemStatus) != 0;
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::getRI()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::getRI");
|
||||
}
|
||||
DWORD dwModemStatus;
|
||||
if (!GetCommModemStatus(fd_, &dwModemStatus)) {
|
||||
THROW (IOException, "Error getting the status of the RI line.");
|
||||
}
|
||||
|
||||
return (MS_RING_ON & dwModemStatus) != 0;
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::SerialImpl::getCD()
|
||||
{
|
||||
if (is_open_ == false) {
|
||||
throw PortNotOpenedException ("Serial::getCD");
|
||||
}
|
||||
DWORD dwModemStatus;
|
||||
if (!GetCommModemStatus(fd_, &dwModemStatus)) {
|
||||
// Error in GetCommModemStatus;
|
||||
THROW (IOException, "Error getting the status of the CD line.");
|
||||
}
|
||||
|
||||
return (MS_RLSD_ON & dwModemStatus) != 0;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::readLock()
|
||||
{
|
||||
if (WaitForSingleObject(read_mutex, INFINITE) != WAIT_OBJECT_0) {
|
||||
THROW (IOException, "Error claiming read mutex.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::readUnlock()
|
||||
{
|
||||
if (!ReleaseMutex(read_mutex)) {
|
||||
THROW (IOException, "Error releasing read mutex.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::writeLock()
|
||||
{
|
||||
if (WaitForSingleObject(write_mutex, INFINITE) != WAIT_OBJECT_0) {
|
||||
THROW (IOException, "Error claiming write mutex.");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Serial::SerialImpl::writeUnlock()
|
||||
{
|
||||
if (!ReleaseMutex(write_mutex)) {
|
||||
THROW (IOException, "Error releasing write mutex.");
|
||||
}
|
||||
}
|
||||
|
||||
#endif // #if defined(_WIN32)
|
||||
|
||||
@@ -1,415 +0,0 @@
|
||||
/* Copyright 2012 William Woodall and John Harrison */
|
||||
#include <algorithm>
|
||||
|
||||
#if !defined(_WIN32) && !defined(__OpenBSD__) && !defined(__FreeBSD__)
|
||||
# include <alloca.h>
|
||||
#endif
|
||||
|
||||
#if defined (__MINGW32__)
|
||||
# define alloca __builtin_alloca
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef _WIN32
|
||||
#include "include/serial.h"
|
||||
#include "include/impl/win.h"
|
||||
#else
|
||||
#include "../include/serial.h"
|
||||
#include "../include/impl/unix.h"
|
||||
#endif
|
||||
|
||||
using std::invalid_argument;
|
||||
using std::min;
|
||||
using std::numeric_limits;
|
||||
using std::vector;
|
||||
using std::size_t;
|
||||
using std::string;
|
||||
|
||||
using serial::Serial;
|
||||
using serial::SerialException;
|
||||
using serial::IOException;
|
||||
using serial::bytesize_t;
|
||||
using serial::parity_t;
|
||||
using serial::stopbits_t;
|
||||
using serial::flowcontrol_t;
|
||||
|
||||
class Serial::ScopedReadLock {
|
||||
public:
|
||||
ScopedReadLock(SerialImpl *pimpl) : pimpl_(pimpl) {
|
||||
this->pimpl_->readLock();
|
||||
}
|
||||
~ScopedReadLock() {
|
||||
this->pimpl_->readUnlock();
|
||||
}
|
||||
private:
|
||||
// Disable copy constructors
|
||||
ScopedReadLock(const ScopedReadLock&);
|
||||
const ScopedReadLock& operator=(ScopedReadLock);
|
||||
|
||||
SerialImpl *pimpl_;
|
||||
};
|
||||
|
||||
class Serial::ScopedWriteLock {
|
||||
public:
|
||||
ScopedWriteLock(SerialImpl *pimpl) : pimpl_(pimpl) {
|
||||
this->pimpl_->writeLock();
|
||||
}
|
||||
~ScopedWriteLock() {
|
||||
this->pimpl_->writeUnlock();
|
||||
}
|
||||
private:
|
||||
// Disable copy constructors
|
||||
ScopedWriteLock(const ScopedWriteLock&);
|
||||
const ScopedWriteLock& operator=(ScopedWriteLock);
|
||||
SerialImpl *pimpl_;
|
||||
};
|
||||
|
||||
Serial::Serial (const string &port, uint32_t baudrate, serial::Timeout timeout,
|
||||
bytesize_t bytesize, parity_t parity, stopbits_t stopbits,
|
||||
flowcontrol_t flowcontrol)
|
||||
: pimpl_(new SerialImpl (port, baudrate, bytesize, parity,
|
||||
stopbits, flowcontrol))
|
||||
{
|
||||
pimpl_->setTimeout(timeout);
|
||||
}
|
||||
|
||||
Serial::~Serial ()
|
||||
{
|
||||
delete pimpl_;
|
||||
}
|
||||
|
||||
void
|
||||
Serial::open ()
|
||||
{
|
||||
pimpl_->open ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::close ()
|
||||
{
|
||||
pimpl_->close ();
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::isOpen () const
|
||||
{
|
||||
return pimpl_->isOpen ();
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::available ()
|
||||
{
|
||||
return pimpl_->available ();
|
||||
}
|
||||
|
||||
bool
|
||||
Serial::waitReadable ()
|
||||
{
|
||||
serial::Timeout timeout(pimpl_->getTimeout ());
|
||||
return pimpl_->waitReadable(timeout.read_timeout_constant);
|
||||
}
|
||||
|
||||
void
|
||||
Serial::waitByteTimes (size_t count)
|
||||
{
|
||||
pimpl_->waitByteTimes(count);
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::read_ (uint8_t *buffer, size_t size)
|
||||
{
|
||||
return this->pimpl_->read (buffer, size);
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::read (uint8_t *buffer, size_t size)
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
return this->pimpl_->read (buffer, size);
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::read (std::vector<uint8_t> &buffer, size_t size)
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
uint8_t *buffer_ = new uint8_t[size];
|
||||
size_t bytes_read = this->pimpl_->read (buffer_, size);
|
||||
buffer.insert (buffer.end (), buffer_, buffer_+bytes_read);
|
||||
delete[] buffer_;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::read (std::string &buffer, size_t size)
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
uint8_t *buffer_ = new uint8_t[size];
|
||||
size_t bytes_read = this->pimpl_->read (buffer_, size);
|
||||
buffer.append (reinterpret_cast<const char*>(buffer_), bytes_read);
|
||||
delete[] buffer_;
|
||||
return bytes_read;
|
||||
}
|
||||
|
||||
string
|
||||
Serial::read (size_t size)
|
||||
{
|
||||
std::string buffer;
|
||||
this->read (buffer, size);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::readline (string &buffer, size_t size, string eol)
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
size_t eol_len = eol.length ();
|
||||
uint8_t *buffer_ = static_cast<uint8_t*>
|
||||
(alloca (size * sizeof (uint8_t)));
|
||||
size_t read_so_far = 0;
|
||||
while (true)
|
||||
{
|
||||
size_t bytes_read = this->read_ (buffer_ + read_so_far, 1);
|
||||
read_so_far += bytes_read;
|
||||
if (bytes_read == 0) {
|
||||
break; // Timeout occured on reading 1 byte
|
||||
}
|
||||
if (string (reinterpret_cast<const char*>
|
||||
(buffer_ + read_so_far - eol_len), eol_len) == eol) {
|
||||
break; // EOL found
|
||||
}
|
||||
if (read_so_far == size) {
|
||||
break; // Reached the maximum read length
|
||||
}
|
||||
}
|
||||
buffer.append(reinterpret_cast<const char*> (buffer_), read_so_far);
|
||||
return read_so_far;
|
||||
}
|
||||
|
||||
string
|
||||
Serial::readline (size_t size, string eol)
|
||||
{
|
||||
std::string buffer;
|
||||
this->readline (buffer, size, eol);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
vector<string>
|
||||
Serial::readlines (size_t size, string eol)
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
std::vector<std::string> lines;
|
||||
size_t eol_len = eol.length ();
|
||||
uint8_t *buffer_ = static_cast<uint8_t*>
|
||||
(alloca (size * sizeof (uint8_t)));
|
||||
size_t read_so_far = 0;
|
||||
size_t start_of_line = 0;
|
||||
while (read_so_far < size) {
|
||||
size_t bytes_read = this->read_ (buffer_+read_so_far, 1);
|
||||
read_so_far += bytes_read;
|
||||
if (bytes_read == 0) {
|
||||
if (start_of_line != read_so_far) {
|
||||
lines.push_back (
|
||||
string (reinterpret_cast<const char*> (buffer_ + start_of_line),
|
||||
read_so_far - start_of_line));
|
||||
}
|
||||
break; // Timeout occured on reading 1 byte
|
||||
}
|
||||
if (string (reinterpret_cast<const char*>
|
||||
(buffer_ + read_so_far - eol_len), eol_len) == eol) {
|
||||
// EOL found
|
||||
lines.push_back(
|
||||
string(reinterpret_cast<const char*> (buffer_ + start_of_line),
|
||||
read_so_far - start_of_line));
|
||||
start_of_line = read_so_far;
|
||||
}
|
||||
if (read_so_far == size) {
|
||||
if (start_of_line != read_so_far) {
|
||||
lines.push_back(
|
||||
string(reinterpret_cast<const char*> (buffer_ + start_of_line),
|
||||
read_so_far - start_of_line));
|
||||
}
|
||||
break; // Reached the maximum read length
|
||||
}
|
||||
}
|
||||
return lines;
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::write (const string &data)
|
||||
{
|
||||
ScopedWriteLock lock(this->pimpl_);
|
||||
return this->write_ (reinterpret_cast<const uint8_t*>(data.c_str()),
|
||||
data.length());
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::write (const std::vector<uint8_t> &data)
|
||||
{
|
||||
ScopedWriteLock lock(this->pimpl_);
|
||||
return this->write_ (&data[0], data.size());
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::write (const uint8_t *data, size_t size)
|
||||
{
|
||||
ScopedWriteLock lock(this->pimpl_);
|
||||
return this->write_(data, size);
|
||||
}
|
||||
|
||||
size_t
|
||||
Serial::write_ (const uint8_t *data, size_t length)
|
||||
{
|
||||
return pimpl_->write (data, length);
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setPort (const string &port)
|
||||
{
|
||||
ScopedReadLock rlock(this->pimpl_);
|
||||
ScopedWriteLock wlock(this->pimpl_);
|
||||
bool was_open = pimpl_->isOpen ();
|
||||
if (was_open) close();
|
||||
pimpl_->setPort (port);
|
||||
if (was_open) open ();
|
||||
}
|
||||
|
||||
string
|
||||
Serial::getPort () const
|
||||
{
|
||||
return pimpl_->getPort ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setTimeout (serial::Timeout &timeout)
|
||||
{
|
||||
pimpl_->setTimeout (timeout);
|
||||
}
|
||||
|
||||
serial::Timeout
|
||||
Serial::getTimeout () const {
|
||||
return pimpl_->getTimeout ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setBaudrate (uint32_t baudrate)
|
||||
{
|
||||
pimpl_->setBaudrate (baudrate);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
Serial::getBaudrate () const
|
||||
{
|
||||
return uint32_t(pimpl_->getBaudrate ());
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setBytesize (bytesize_t bytesize)
|
||||
{
|
||||
pimpl_->setBytesize (bytesize);
|
||||
}
|
||||
|
||||
bytesize_t
|
||||
Serial::getBytesize () const
|
||||
{
|
||||
return pimpl_->getBytesize ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setParity (parity_t parity)
|
||||
{
|
||||
pimpl_->setParity (parity);
|
||||
}
|
||||
|
||||
parity_t
|
||||
Serial::getParity () const
|
||||
{
|
||||
return pimpl_->getParity ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setStopbits (stopbits_t stopbits)
|
||||
{
|
||||
pimpl_->setStopbits (stopbits);
|
||||
}
|
||||
|
||||
stopbits_t
|
||||
Serial::getStopbits () const
|
||||
{
|
||||
return pimpl_->getStopbits ();
|
||||
}
|
||||
|
||||
void
|
||||
Serial::setFlowcontrol (flowcontrol_t flowcontrol)
|
||||
{
|
||||
pimpl_->setFlowcontrol (flowcontrol);
|
||||
}
|
||||
|
||||
flowcontrol_t
|
||||
Serial::getFlowcontrol () const
|
||||
{
|
||||
return pimpl_->getFlowcontrol ();
|
||||
}
|
||||
|
||||
void Serial::flush ()
|
||||
{
|
||||
ScopedReadLock rlock(this->pimpl_);
|
||||
ScopedWriteLock wlock(this->pimpl_);
|
||||
pimpl_->flush ();
|
||||
}
|
||||
|
||||
void Serial::flushInput ()
|
||||
{
|
||||
ScopedReadLock lock(this->pimpl_);
|
||||
pimpl_->flushInput ();
|
||||
}
|
||||
|
||||
void Serial::flushOutput ()
|
||||
{
|
||||
ScopedWriteLock lock(this->pimpl_);
|
||||
pimpl_->flushOutput ();
|
||||
}
|
||||
|
||||
void Serial::sendBreak (int duration)
|
||||
{
|
||||
pimpl_->sendBreak (duration);
|
||||
}
|
||||
|
||||
void Serial::setBreak (bool level)
|
||||
{
|
||||
pimpl_->setBreak (level);
|
||||
}
|
||||
|
||||
void Serial::setRTS (bool level)
|
||||
{
|
||||
pimpl_->setRTS (level);
|
||||
}
|
||||
|
||||
void Serial::setDTR (bool level)
|
||||
{
|
||||
pimpl_->setDTR (level);
|
||||
}
|
||||
|
||||
bool Serial::waitForChange()
|
||||
{
|
||||
return pimpl_->waitForChange();
|
||||
}
|
||||
|
||||
bool Serial::getCTS ()
|
||||
{
|
||||
return pimpl_->getCTS ();
|
||||
}
|
||||
|
||||
bool Serial::getDSR ()
|
||||
{
|
||||
return pimpl_->getDSR ();
|
||||
}
|
||||
|
||||
bool Serial::getRI ()
|
||||
{
|
||||
return pimpl_->getRI ();
|
||||
}
|
||||
|
||||
bool Serial::getCD ()
|
||||
{
|
||||
return pimpl_->getCD ();
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
newmtl BobRock:lambert18SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd Bobhelemaal2.png
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 0.06
|
||||
|
Before Width: | Height: | Size: 241 KiB |
@@ -82,6 +82,14 @@ Kd 0.00 1.00 1.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl rock1:Material_001
|
||||
illum 4
|
||||
Kd 0.64 0.64 0.64
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl rock3:Material_016
|
||||
illum 4
|
||||
Kd 0.64 0.64 0.64
|
||||
@@ -90,7 +90,7 @@ illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd BobStoneTexture.png
|
||||
map_Kd Bobhelemaal2.png
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
newmtl pasted__lambert2SG
|
||||
|
Before Width: | Height: | Size: 232 KiB After Width: | Height: | Size: 232 KiB |
@@ -1,6 +0,0 @@
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 1.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
|
Before Width: | Height: | Size: 468 KiB |
|
Before Width: | Height: | Size: 254 KiB |
@@ -1,7 +1,61 @@
|
||||
newmtl Monkey1:initialShadingGroup
|
||||
newmtl Engine_Thomas:Eyes
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd Eye_01.png
|
||||
Ni 1.00
|
||||
Ks 0.37 0.37 0.37
|
||||
Ns 96.08
|
||||
newmtl Engine_Thomas:Page_01
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd engine_thomas_page1.png
|
||||
Ni 1.00
|
||||
Ks 0.37 0.37 0.37
|
||||
Ns 96.08
|
||||
newmtl Engine_Thomas:Page_02
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd engine_thomas_page2.png
|
||||
Ni 1.00
|
||||
Ks 0.37 0.37 0.37
|
||||
Ns 96.08
|
||||
newmtl Engine_Thomas:Page_05
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 0.00 0.00 0.00
|
||||
map_Kd Engine_Thomas_Page3.png
|
||||
Ni 1.00
|
||||
Ks 0.37 0.37 0.37
|
||||
Ns 96.08
|
||||
newmtl Engine_Thomas:Shadow
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 0.00 0.00 0.00
|
||||
map_Kd Thomas_Shadow.png
|
||||
Ni 1.00
|
||||
Ks 0.37 0.37 0.37
|
||||
Ns 96.08
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd tex_wendy.jpg
|
||||
Ni 1.00
|
||||
newmtl wooper:wooper
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.20 0.20 0.20
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd wooper.png
|
||||
Ni 1.00
|
||||
Ks 0.00 0.00 0.00
|
||||
Ns 0.00
|
||||
|
||||
@@ -6,7 +6,7 @@ Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Kd 0.67 0.67 0.67
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
@@ -90,7 +90,7 @@ illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd BobStoneTexture.png
|
||||
map_Kd Bobhelemaal2.png
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
newmtl pasted__lambert2SG
|
||||
|
Before Width: | Height: | Size: 580 KiB After Width: | Height: | Size: 580 KiB |
@@ -1,99 +0,0 @@
|
||||
newmtl SpringIsComing:Material_007
|
||||
illum 4
|
||||
Kd 0.75 0.80 0.80
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree01:Material_001
|
||||
illum 4
|
||||
Kd 0.01 0.00 0.00
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree01:Material_004
|
||||
illum 4
|
||||
Kd 0.60 0.20 0.30
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree02:Material_001
|
||||
illum 4
|
||||
Kd 0.01 0.00 0.00
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree02:Material_004
|
||||
illum 4
|
||||
Kd 0.60 0.20 0.30
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree03:Material_001
|
||||
illum 4
|
||||
Kd 0.01 0.00 0.00
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree03:Material_004
|
||||
illum 4
|
||||
Kd 0.60 0.20 0.30
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree04:Material_001
|
||||
illum 4
|
||||
Kd 0.01 0.00 0.00
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl Tree04:Material_004
|
||||
illum 4
|
||||
Kd 0.60 0.20 0.30
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 0.34 0.34 0.34
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert2SG
|
||||
illum 4
|
||||
Kd 0.00 1.00 1.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert3SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd InktvisTextureRock.png
|
||||
Ni 1.00
|
||||
newmtl rock3:Material_016
|
||||
illum 4
|
||||
Kd 0.64 0.64 0.64
|
||||
Ka 1.00 1.00 1.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
Ns 96.08
|
||||
@@ -1,7 +0,0 @@
|
||||
newmtl SquidRock:lambert3SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd InktvisTextureFire.png
|
||||
Ni 1.00
|
||||
@@ -1,7 +0,0 @@
|
||||
newmtl Squid:lambert3SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd InktvisTextureRock.png
|
||||
Ni 1.00
|
||||
|
Before Width: | Height: | Size: 599 KiB After Width: | Height: | Size: 599 KiB |
@@ -6,7 +6,7 @@ Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Kd 0.67 0.67 0.67
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
@@ -92,40 +92,9 @@ illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd BobStoneTexture.png
|
||||
map_Kd Bobhelemaal2.png
|
||||
Ni 1.00
|
||||
Ks 0.50 0.50 0.50
|
||||
newmtl lambert19SG
|
||||
illum 4
|
||||
Kd 0.85 0.85 0.85
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert20SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 0.64 0.64 0.64
|
||||
Ni 1.00
|
||||
newmtl lambert21SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert22SG
|
||||
illum 4
|
||||
Kd 0.50 0.50 0.50
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert23SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd VincentTexture.png
|
||||
Ni 1.00
|
||||
newmtl pasted__lambert2SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
@@ -1,7 +0,0 @@
|
||||
newmtl VincentRock:lambert23SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd VincentTextureFire.png
|
||||
Ni 1.00
|
||||
|
Before Width: | Height: | Size: 142 KiB |
|
Before Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 1.5 MiB |
@@ -1,509 +0,0 @@
|
||||
# This file uses centimeters as units for non-parametric coordinates.
|
||||
|
||||
mtllib DragonWall1.mtl
|
||||
g default
|
||||
v 31.479097 0.032439 -6.902821
|
||||
v -31.479097 0.032439 -6.902821
|
||||
v 31.479097 37.811227 -7.156591
|
||||
v -31.479097 37.811227 -7.156591
|
||||
v 31.479097 37.755655 4.670846
|
||||
v -31.479097 37.765894 2.489812
|
||||
v 33.071286 -0.014894 3.168986
|
||||
v -31.479097 -0.027298 5.808684
|
||||
v 0.000000 18.856953 6.775930
|
||||
v 0.000000 37.743745 6.815244
|
||||
v -0.000000 -0.032441 6.902821
|
||||
v 31.479097 18.856953 6.775930
|
||||
v 31.479097 19.806234 -7.035645
|
||||
v -31.479097 19.806234 -7.035645
|
||||
v -33.219027 18.856953 6.775930
|
||||
v 15.739548 37.746344 6.649046
|
||||
v 15.739548 28.301650 6.712488
|
||||
v 15.739548 9.412260 6.839373
|
||||
v 15.739548 -0.016573 3.526865
|
||||
v 15.739548 18.854960 8.669850
|
||||
v -15.739548 37.744744 6.751334
|
||||
v -15.739548 28.294204 8.320270
|
||||
v -15.739548 18.850288 7.202108
|
||||
v -15.739548 9.405386 7.278817
|
||||
v -15.739548 -0.022680 6.278613
|
||||
v 33.762048 28.317519 3.336535
|
||||
v 0.000000 28.303989 9.058642
|
||||
v -31.479097 28.301650 6.712488
|
||||
v -31.479097 9.415253 6.202581
|
||||
v 0.000000 9.409420 9.521046
|
||||
v 32.843955 9.428125 3.463421
|
||||
v -7.869774 23.581444 7.644574
|
||||
v 7.869774 23.573183 9.630958
|
||||
v 7.869774 14.131984 8.590231
|
||||
v -7.869774 14.108179 8.497199
|
||||
v -23.609324 4.689909 6.871096
|
||||
v -23.609324 14.127120 9.157310
|
||||
v -23.609324 23.559216 8.028686
|
||||
v -23.609324 33.005188 8.902707
|
||||
v -7.869774 33.026725 6.506093
|
||||
v 7.869774 33.018276 7.046262
|
||||
v 23.609324 33.028606 6.385878
|
||||
v 23.609324 23.583752 6.460023
|
||||
v 23.609324 14.134605 6.807655
|
||||
v 23.609324 4.714278 5.313189
|
||||
v 7.869774 4.689909 6.871096
|
||||
v -7.869774 4.679063 9.179434
|
||||
v 34.217941 19.089080 3.398532
|
||||
v -34.325875 33.612990 -1.033724
|
||||
v -31.479097 28.808740 -7.096119
|
||||
v -31.479097 23.952114 -0.326363
|
||||
v -31.479097 14.375229 -0.116500
|
||||
v -31.479097 9.919341 -6.969232
|
||||
v -33.938226 5.088499 0.159210
|
||||
v 34.829148 32.894605 -1.722389
|
||||
v 31.479097 28.808740 -7.096119
|
||||
v 31.479097 24.009146 -1.913821
|
||||
v 32.610234 14.557205 -1.725438
|
||||
v 31.479097 9.919341 -6.969232
|
||||
v 33.671430 5.250531 -1.145710
|
||||
v 7.869774 37.746344 6.649046
|
||||
v 7.869774 28.272630 9.815706
|
||||
v 7.869774 18.875384 6.480806
|
||||
v 7.869774 9.403860 8.626516
|
||||
v 7.869774 -0.024507 5.214843
|
||||
v 23.261588 37.750794 5.703650
|
||||
v 24.750799 28.322892 4.173673
|
||||
v 23.609324 18.851017 8.038712
|
||||
v 24.291751 9.425791 4.793524
|
||||
v 24.405418 -0.015655 3.342998
|
||||
v -7.857922 37.746344 6.649046
|
||||
v -7.869774 28.316095 7.602681
|
||||
v -7.869774 18.846561 7.440290
|
||||
v -7.869774 9.397081 9.059896
|
||||
v -7.869774 -0.032441 6.902821
|
||||
v -23.609324 -0.029871 6.355752
|
||||
v -23.609324 9.412749 6.585387
|
||||
v -24.479289 18.828812 8.575101
|
||||
v -23.609324 28.268887 9.373000
|
||||
v -23.609324 37.756119 4.569429
|
||||
v -31.479097 33.033772 4.601150
|
||||
v -15.739548 33.017513 7.661214
|
||||
v 0.000000 33.011427 8.732246
|
||||
v 15.739548 33.023997 6.680767
|
||||
v 32.620573 33.036587 4.003690
|
||||
v 32.620573 23.587235 5.056233
|
||||
v 15.739548 23.576169 7.827765
|
||||
v 0.000000 23.575834 8.213789
|
||||
v -15.739548 23.575492 7.553615
|
||||
v -32.349062 23.579301 6.744209
|
||||
v -32.349062 14.136103 6.489256
|
||||
v -15.739548 14.117970 7.871304
|
||||
v 0.000000 14.129481 8.385483
|
||||
v 15.739548 14.131662 7.879160
|
||||
v 32.161526 14.142540 5.119675
|
||||
v 32.957620 4.706616 3.316203
|
||||
v 15.739548 4.697844 5.183119
|
||||
v 0.000000 4.685021 8.433733
|
||||
v -15.739548 4.708207 5.701237
|
||||
v -31.479097 4.693977 6.005632
|
||||
vt 0.003508 0.474197
|
||||
vt 0.003720 0.304675
|
||||
vt 0.173029 0.474409
|
||||
vt 0.173241 0.304887
|
||||
vt 0.190029 0.096736
|
||||
vt 0.173010 0.823395
|
||||
vt 0.002961 0.827333
|
||||
vt 0.991265 0.897972
|
||||
vt 0.002961 0.996854
|
||||
vt 0.172483 0.996854
|
||||
vt 0.003932 0.135154
|
||||
vt 0.173453 0.135366
|
||||
vt 0.003296 0.643718
|
||||
vt 0.172818 0.643930
|
||||
vt 0.590647 0.497354
|
||||
vt 0.590647 0.096736
|
||||
vt 0.590647 0.897972
|
||||
vt 0.088057 0.643824
|
||||
vt 0.190029 0.497354
|
||||
vt 0.092237 0.474308
|
||||
vt 0.092449 0.304786
|
||||
vt 0.991265 0.497354
|
||||
vt 0.088693 0.135260
|
||||
vt 0.390338 0.096736
|
||||
vt 0.390338 0.297045
|
||||
vt 0.390338 0.697663
|
||||
vt 0.390338 0.897972
|
||||
vt 0.390338 0.497354
|
||||
vt 0.790956 0.096736
|
||||
vt 0.790956 0.297045
|
||||
vt 0.790956 0.497354
|
||||
vt 0.790956 0.697663
|
||||
vt 0.790956 0.897972
|
||||
vt 0.130437 0.643877
|
||||
vt 0.190029 0.297045
|
||||
vt 0.590647 0.297045
|
||||
vt 0.991265 0.297045
|
||||
vt 0.131073 0.135313
|
||||
vt 0.991265 0.697663
|
||||
vt 0.046312 0.135207
|
||||
vt 0.590647 0.697663
|
||||
vt 0.045677 0.643771
|
||||
vt 0.190029 0.697663
|
||||
vt 0.690802 0.397199
|
||||
vt 0.490493 0.397199
|
||||
vt 0.490493 0.597508
|
||||
vt 0.690802 0.597508
|
||||
vt 0.891111 0.797817
|
||||
vt 0.891111 0.597508
|
||||
vt 0.891111 0.397199
|
||||
vt 0.891111 0.196890
|
||||
vt 0.690802 0.196890
|
||||
vt 0.490493 0.196890
|
||||
vt 0.290184 0.196890
|
||||
vt 0.290184 0.397199
|
||||
vt 0.290184 0.597508
|
||||
vt 0.290184 0.797817
|
||||
vt 0.490493 0.797817
|
||||
vt 0.690802 0.797817
|
||||
vt 0.089079 0.602372
|
||||
vt 0.154625 0.230024
|
||||
vt 0.132845 0.304837
|
||||
vt 0.111298 0.222081
|
||||
vt 0.068335 0.216153
|
||||
vt 0.048085 0.304731
|
||||
vt 0.026672 0.213355
|
||||
vt 0.150972 0.562173
|
||||
vt 0.132633 0.474358
|
||||
vt 0.111101 0.558042
|
||||
vt 0.068688 0.560019
|
||||
vt 0.047873 0.474252
|
||||
vt 0.026927 0.568374
|
||||
vt 0.130103 0.827333
|
||||
vt 0.172483 0.827333
|
||||
vt 0.045342 0.827333
|
||||
vt 0.087722 0.827333
|
||||
vt 0.190029 0.897972
|
||||
vt 0.130629 0.823395
|
||||
vt 0.991265 0.096736
|
||||
vt 0.045869 0.823395
|
||||
vt 0.088249 0.823395
|
||||
vt 0.003488 0.823395
|
||||
vt 0.003488 0.653873
|
||||
vt 0.173010 0.653873
|
||||
vt 0.490493 0.096736
|
||||
vt 0.067059 0.823395
|
||||
vt 0.490493 0.297045
|
||||
vt 0.490493 0.497354
|
||||
vt 0.490493 0.697663
|
||||
vt 0.066532 0.827333
|
||||
vt 0.490493 0.897972
|
||||
vt 0.294609 0.096736
|
||||
vt 0.025615 0.823395
|
||||
vt 0.290184 0.297045
|
||||
vt 0.290184 0.497354
|
||||
vt 0.290184 0.697663
|
||||
vt 0.024152 0.827333
|
||||
vt 0.290184 0.897972
|
||||
vt 0.690651 0.096736
|
||||
vt 0.109407 0.823395
|
||||
vt 0.690802 0.297045
|
||||
vt 0.690802 0.497354
|
||||
vt 0.690802 0.697663
|
||||
vt 0.108912 0.827333
|
||||
vt 0.690802 0.897972
|
||||
vt 0.151293 0.827333
|
||||
vt 0.891111 0.897972
|
||||
vt 0.891111 0.697663
|
||||
vt 0.891111 0.497354
|
||||
vt 0.891111 0.297045
|
||||
vt 0.891111 0.096736
|
||||
vt 0.151820 0.823395
|
||||
vt 0.991265 0.196890
|
||||
vt 0.152263 0.135340
|
||||
vt 0.790956 0.196890
|
||||
vt 0.590647 0.196890
|
||||
vt 0.390338 0.196890
|
||||
vt 0.151627 0.643904
|
||||
vt 0.190029 0.196890
|
||||
vt 0.109247 0.643851
|
||||
vt 0.190029 0.397199
|
||||
vt 0.390338 0.397199
|
||||
vt 0.590647 0.397199
|
||||
vt 0.790956 0.397199
|
||||
vt 0.991265 0.397199
|
||||
vt 0.109883 0.135287
|
||||
vt 0.991265 0.597508
|
||||
vt 0.067502 0.135234
|
||||
vt 0.790956 0.597508
|
||||
vt 0.590647 0.597508
|
||||
vt 0.390338 0.597508
|
||||
vt 0.066867 0.643798
|
||||
vt 0.190029 0.597508
|
||||
vt 0.024486 0.643745
|
||||
vt 0.190029 0.797817
|
||||
vt 0.390338 0.797817
|
||||
vt 0.590647 0.797817
|
||||
vt 0.790956 0.797817
|
||||
vt 0.991265 0.797817
|
||||
vt 0.025122 0.135181
|
||||
vn 0.020668 -0.006359 -0.999766
|
||||
vn -0.027113 -0.006730 -0.999610
|
||||
vn -0.029610 -0.008886 -0.999522
|
||||
vn -0.018928 0.582161 -0.812853
|
||||
vn 0.018016 0.582415 -0.812692
|
||||
vn 0.023788 -0.008855 -0.999678
|
||||
vn -0.035951 0.998946 0.028539
|
||||
vn -0.005927 0.999621 0.026889
|
||||
vn -0.001724 0.998900 0.046871
|
||||
vn -0.000099 0.999594 0.028507
|
||||
vn -0.001066 0.999450 0.033146
|
||||
vn 0.000239 0.999616 0.027720
|
||||
vn 0.001383 0.999481 0.032180
|
||||
vn 0.002838 0.999623 0.027315
|
||||
vn 0.023608 0.999075 0.035929
|
||||
vn 0.321404 0.009046 0.946899
|
||||
vn 0.110315 0.035313 0.993269
|
||||
vn 0.162658 -0.287097 0.943990
|
||||
vn 0.033801 -0.998996 0.029409
|
||||
vn 0.000533 -0.999771 0.021368
|
||||
vn 0.002117 -0.999772 0.021246
|
||||
vn 0.005055 -0.999808 0.018948
|
||||
vn 0.004850 -0.999488 0.031631
|
||||
vn -0.001233 -0.999714 0.023866
|
||||
vn -0.005046 -0.999505 0.031049
|
||||
vn -0.000854 -0.999738 0.022885
|
||||
vn -0.035927 -0.998989 0.027020
|
||||
vn -0.024015 -0.532076 -0.846356
|
||||
vn 0.019313 -0.540765 -0.840952
|
||||
vn -0.991482 -0.122312 -0.044749
|
||||
vn -0.897928 0.012500 0.439965
|
||||
vn -0.894575 0.167584 0.414309
|
||||
vn -0.801506 0.141204 0.581076
|
||||
vn 0.989720 0.036899 -0.138174
|
||||
vn 0.165553 -0.113456 0.979653
|
||||
vn -0.058512 0.164315 0.984671
|
||||
vn 0.042469 0.059133 0.997346
|
||||
vn 0.045935 0.008850 0.998905
|
||||
vn 0.106547 -0.157211 0.981801
|
||||
vn -0.026154 -0.085747 0.995974
|
||||
vn -0.103022 0.084266 0.991103
|
||||
vn -0.049959 0.130769 0.990153
|
||||
vn -0.136659 0.069647 0.988167
|
||||
vn 0.049676 -0.020355 0.998558
|
||||
vn 0.991902 -0.032619 0.122745
|
||||
vn 0.983991 0.037132 -0.174309
|
||||
vn -0.030035 -0.005291 -0.999535
|
||||
vn 0.024103 -0.006156 -0.999691
|
||||
vn -0.994879 0.090637 -0.044724
|
||||
vn -0.832236 -0.103331 0.544707
|
||||
vn -0.900561 -0.189709 0.391152
|
||||
vn 0.205618 0.141269 0.968382
|
||||
vn 0.114354 0.198929 0.973319
|
||||
vn 0.033116 -0.190324 0.981163
|
||||
vn 0.015462 0.158566 0.987227
|
||||
vn 0.110222 -0.188450 0.975878
|
||||
vn 0.014253 -0.046187 0.998831
|
||||
vn 0.156558 -0.170027 0.972924
|
||||
vn 0.161772 -0.255237 0.953249
|
||||
vn 0.166367 0.319661 0.932812
|
||||
vn 0.194003 0.199631 0.960474
|
||||
vn 0.024099 -0.115882 0.992971
|
||||
vn -0.143572 0.288295 0.946717
|
||||
vn -0.038624 0.118202 0.992238
|
||||
vn -0.066326 -0.069376 0.995383
|
||||
vn -0.037925 -0.104006 0.993853
|
||||
vn -0.013212 -0.055146 0.998391
|
||||
vn 0.716275 0.075177 0.693757
|
||||
vn -0.030135 0.181445 0.982939
|
||||
vn 0.128242 0.267820 0.954896
|
||||
vn -0.041887 0.145090 0.988531
|
||||
vn -0.711577 0.286281 0.641640
|
||||
vn -0.701297 -0.029712 0.712249
|
||||
vn 0.139225 -0.261755 0.955040
|
||||
vn -0.104466 -0.180682 0.977978
|
||||
vn 0.189812 -0.320573 0.928011
|
||||
vn 0.712014 -0.004752 0.702150
|
||||
vn 0.508499 -0.218956 0.832759
|
||||
vn 0.476244 0.196654 0.857041
|
||||
vn -0.001261 -0.032857 0.999459
|
||||
vn 0.028390 0.094182 0.995150
|
||||
vn -0.123244 -0.237082 0.963641
|
||||
vn -0.076397 -0.099868 0.992063
|
||||
vn -0.006115 0.280804 0.959746
|
||||
vn -0.112554 -0.075206 0.990795
|
||||
vn -0.064545 -0.230261 0.970986
|
||||
vn -0.081762 -0.070291 0.994170
|
||||
vn 0.148438 0.162087 0.975548
|
||||
vn 0.041915 0.006711 0.999099
|
||||
vn 0.895551 0.046444 0.442529
|
||||
vn 0.142393 0.007242 0.989784
|
||||
vn 0.852500 -0.090421 0.514847
|
||||
vn 0.178792 -0.150608 0.972291
|
||||
vn 0.093487 -0.330005 0.939338
|
||||
vn 0.990864 -0.012272 -0.134309
|
||||
vn 0.965078 -0.124817 -0.230316
|
||||
vn -0.998266 -0.058861 -0.000783
|
||||
vn -0.999945 0.007754 0.007012
|
||||
vn 0.100111 -0.010887 0.994917
|
||||
vn -0.125087 -0.227456 0.965721
|
||||
s 1
|
||||
g pCube1
|
||||
usemtl lambert2SG
|
||||
f 13/20/1 14/21/2 50/62/3 4/4/4 3/3/5 56/68/6
|
||||
f 3/83/5 4/84/4 6/6/7 80/112/8 21/78/9 71/100/10 10/81/11 61/86/12 16/80/13 66/93/14 5/82/15
|
||||
f 12/19/16 68/95/17 44/56/18
|
||||
f 7/7/19 70/97/20 19/75/21 65/90/22 11/76/23 75/104/24 25/73/25 76/106/26 8/74/27 2/10/28 1/9/29
|
||||
f 51/63/30 15/23/31 90/126/32 28/38/33
|
||||
f 5/14/15 55/67/34 3/3/5
|
||||
f 5/5/15 66/92/14 42/54/35
|
||||
f 35/47/36 23/31/37 92/129/38
|
||||
f 7/77/19 45/57/39 70/98/20
|
||||
f 32/44/40 27/36/41 72/101/42
|
||||
f 35/47/36 74/103/43 30/41/44
|
||||
f 48/60/45 58/70/46 13/20/1
|
||||
f 1/1/29 2/2/28 53/65/47 14/21/2 13/20/1 59/71/48
|
||||
f 15/23/31 52/64/49 29/40/50 91/128/51
|
||||
f 17/25/52 62/87/53 33/45/54
|
||||
f 34/46/55 94/131/56 20/28/57
|
||||
f 34/46/55 64/89/58 18/26/59
|
||||
f 12/19/16 43/55/60 68/95/17
|
||||
f 33/45/54 20/28/57 87/122/61
|
||||
f 23/31/37 32/44/40 89/124/62
|
||||
f 39/51/63 80/111/8 6/79/7
|
||||
f 78/109/64 38/50/65 15/22/31
|
||||
f 37/49/66 78/109/64 15/22/31
|
||||
f 76/107/26 36/48/67 8/8/27
|
||||
f 5/5/15 42/54/35 85/119/68
|
||||
f 83/116/69 41/53/70 10/16/11
|
||||
f 40/52/71 83/116/69 10/16/11
|
||||
f 81/113/72 39/51/63 6/79/7
|
||||
f 36/48/67 100/139/73 8/8/27
|
||||
f 11/17/23 98/137/74 47/59/75
|
||||
f 11/17/23 46/58/76 98/137/74
|
||||
f 96/135/77 45/57/39 7/77/19
|
||||
f 19/27/21 46/58/76 65/91/22
|
||||
f 12/19/16 44/56/18 95/133/78
|
||||
f 86/121/79 43/55/60 12/19/16
|
||||
f 41/53/70 16/24/13 61/85/12
|
||||
f 71/99/10 40/52/71 10/16/11
|
||||
f 15/22/31 38/50/65 90/125/32
|
||||
f 91/127/51 37/49/66 15/22/31
|
||||
f 11/17/23 47/59/75 75/105/24
|
||||
f 9/15/80 32/44/40 73/102/81
|
||||
f 9/15/80 88/123/82 32/44/40
|
||||
f 33/45/54 88/123/82 9/15/80
|
||||
f 33/45/54 63/88/83 20/28/57
|
||||
f 34/46/55 20/28/57 63/88/83
|
||||
f 93/130/84 34/46/55 9/15/80
|
||||
f 35/47/36 93/130/84 9/15/80
|
||||
f 9/15/80 73/102/81 35/47/36
|
||||
f 25/33/25 99/138/85 36/48/67
|
||||
f 36/48/67 77/108/86 29/39/50
|
||||
f 77/108/86 37/49/66 29/39/50
|
||||
f 37/49/66 92/129/38 23/31/37
|
||||
f 23/31/37 89/124/62 38/50/65
|
||||
f 28/37/33 38/50/65 79/110/87
|
||||
f 28/37/33 79/110/87 39/51/63
|
||||
f 39/51/63 82/115/88 21/29/9
|
||||
f 82/115/88 40/52/71 21/29/9
|
||||
f 40/52/71 72/101/42 27/36/41
|
||||
f 17/25/52 41/53/70 62/87/53
|
||||
f 41/53/70 84/117/89 16/24/13
|
||||
f 42/54/35 16/24/13 84/117/89
|
||||
f 26/35/90 42/54/35 67/94/91
|
||||
f 26/35/90 67/94/91 43/55/60
|
||||
f 20/28/57 43/55/60 87/122/61
|
||||
f 44/56/18 20/28/57 94/131/56
|
||||
f 31/43/92 44/56/18 69/96/93
|
||||
f 31/43/92 69/96/93 45/57/39
|
||||
f 19/27/21 45/57/39 97/136/94
|
||||
f 19/27/21 97/136/94 46/58/76
|
||||
f 64/89/58 46/58/76 18/26/59
|
||||
f 47/59/75 30/41/44 74/103/43
|
||||
f 25/33/25 47/59/75 99/138/85
|
||||
f 55/67/34 56/68/6 3/3/5
|
||||
f 12/18/16 48/60/45 26/34/90 86/120/79
|
||||
f 31/42/92 48/60/45 12/18/16 95/132/78
|
||||
f 7/13/19 1/1/29 60/72/95
|
||||
f 58/70/46 59/71/48 13/20/1
|
||||
f 57/69/96 48/60/45 13/20/1
|
||||
f 50/62/3 51/63/30 28/38/33 49/61/97
|
||||
f 54/66/98 8/11/27 100/140/73 29/40/50
|
||||
f 53/65/47 54/66/98 29/40/50 52/64/49
|
||||
f 6/12/7 49/61/97 28/38/33 81/114/72
|
||||
f 4/4/4 49/61/97 6/12/7
|
||||
f 50/62/3 49/61/97 4/4/4
|
||||
f 14/21/2 51/63/30 50/62/3
|
||||
f 14/21/2 15/23/31 51/63/30
|
||||
f 14/21/2 52/64/49 15/23/31
|
||||
f 53/65/47 52/64/49 14/21/2
|
||||
f 2/2/28 54/66/98 53/65/47
|
||||
f 2/2/28 8/11/27 54/66/98
|
||||
f 26/34/90 55/67/34 5/14/15 85/118/68
|
||||
f 56/68/6 57/69/96 13/20/1
|
||||
f 26/34/90 57/69/96 56/68/6 55/67/34
|
||||
f 26/34/90 48/60/45 57/69/96
|
||||
f 31/42/92 58/70/46 48/60/45
|
||||
f 59/71/48 60/72/95 1/1/29
|
||||
f 31/42/92 60/72/95 59/71/48 58/70/46
|
||||
f 7/13/19 60/72/95 31/42/92 96/134/77
|
||||
f 41/53/70 61/85/12 10/16/11
|
||||
f 62/87/53 41/53/70 27/36/41
|
||||
f 33/45/54 62/87/53 27/36/41
|
||||
f 9/15/80 63/88/83 33/45/54
|
||||
f 34/46/55 63/88/83 9/15/80
|
||||
f 30/41/44 64/89/58 34/46/55
|
||||
f 30/41/44 46/58/76 64/89/58
|
||||
f 65/91/22 46/58/76 11/17/23
|
||||
f 42/54/35 66/92/14 16/24/13
|
||||
f 67/94/91 42/54/35 17/25/52
|
||||
f 43/55/60 67/94/91 17/25/52
|
||||
f 68/95/17 43/55/60 20/28/57
|
||||
f 44/56/18 68/95/17 20/28/57
|
||||
f 69/96/93 44/56/18 18/26/59
|
||||
f 45/57/39 69/96/93 18/26/59
|
||||
f 70/98/20 45/57/39 19/27/21
|
||||
f 21/29/9 40/52/71 71/99/10
|
||||
f 22/30/99 72/101/42 40/52/71
|
||||
f 32/44/40 72/101/42 22/30/99
|
||||
f 73/102/81 32/44/40 23/31/37
|
||||
f 35/47/36 73/102/81 23/31/37
|
||||
f 24/32/100 74/103/43 35/47/36
|
||||
f 47/59/75 74/103/43 24/32/100
|
||||
f 75/105/24 47/59/75 25/33/25
|
||||
f 25/33/25 36/48/67 76/107/26
|
||||
f 24/32/100 77/108/86 36/48/67
|
||||
f 24/32/100 37/49/66 77/108/86
|
||||
f 37/49/66 23/31/37 78/109/64
|
||||
f 23/31/37 38/50/65 78/109/64
|
||||
f 79/110/87 38/50/65 22/30/99
|
||||
f 39/51/63 79/110/87 22/30/99
|
||||
f 39/51/63 21/29/9 80/111/8
|
||||
f 28/37/33 39/51/63 81/113/72
|
||||
f 22/30/99 82/115/88 39/51/63
|
||||
f 22/30/99 40/52/71 82/115/88
|
||||
f 40/52/71 27/36/41 83/116/69
|
||||
f 27/36/41 41/53/70 83/116/69
|
||||
f 17/25/52 84/117/89 41/53/70
|
||||
f 42/54/35 84/117/89 17/25/52
|
||||
f 85/119/68 42/54/35 26/35/90
|
||||
f 26/35/90 43/55/60 86/121/79
|
||||
f 87/122/61 43/55/60 17/25/52
|
||||
f 33/45/54 87/122/61 17/25/52
|
||||
f 33/45/54 27/36/41 88/123/82
|
||||
f 32/44/40 88/123/82 27/36/41
|
||||
f 89/124/62 32/44/40 22/30/99
|
||||
f 38/50/65 89/124/62 22/30/99
|
||||
f 90/125/32 38/50/65 28/37/33
|
||||
f 29/39/50 37/49/66 91/127/51
|
||||
f 24/32/100 92/129/38 37/49/66
|
||||
f 35/47/36 92/129/38 24/32/100
|
||||
f 35/47/36 30/41/44 93/130/84
|
||||
f 30/41/44 34/46/55 93/130/84
|
||||
f 18/26/59 94/131/56 34/46/55
|
||||
f 44/56/18 94/131/56 18/26/59
|
||||
f 95/133/78 44/56/18 31/43/92
|
||||
f 31/43/92 45/57/39 96/135/77
|
||||
f 97/136/94 45/57/39 18/26/59
|
||||
f 46/58/76 97/136/94 18/26/59
|
||||
f 98/137/74 46/58/76 30/41/44
|
||||
f 47/59/75 98/137/74 30/41/44
|
||||
f 99/138/85 47/59/75 24/32/100
|
||||
f 36/48/67 99/138/85 24/32/100
|
||||
f 36/48/67 29/39/50 100/139/73
|
||||
@@ -1,334 +0,0 @@
|
||||
# This file uses centimeters as units for non-parametric coordinates.
|
||||
|
||||
mtllib Rock1.mtl
|
||||
g default
|
||||
v 25.733582 0.000000 12.384363
|
||||
v 22.302742 0.000000 10.193544
|
||||
v 18.732163 0.000000 10.102727
|
||||
v 16.342887 0.000000 10.046599
|
||||
v 15.181248 0.000000 14.677952
|
||||
v 15.294976 0.000000 17.126427
|
||||
v 16.467886 0.000000 18.708206
|
||||
v 21.143785 0.000000 18.799023
|
||||
v 24.342128 0.000000 18.673516
|
||||
v 25.733582 0.000000 15.851380
|
||||
v 25.733582 1.111030 12.496619
|
||||
v 22.302742 1.111030 10.193544
|
||||
v 18.791180 1.111030 10.102727
|
||||
v 16.497394 1.111030 10.158855
|
||||
v 15.372229 1.111030 14.677952
|
||||
v 15.449483 1.111030 17.014171
|
||||
v 16.526902 1.111030 18.526571
|
||||
v 21.084769 1.111030 18.617388
|
||||
v 24.342128 1.111030 18.561260
|
||||
v 25.733582 1.111030 15.851380
|
||||
v 24.255984 2.113304 12.652665
|
||||
v 21.378030 2.113304 10.917908
|
||||
v 18.962453 2.113304 10.693795
|
||||
v 16.618637 2.113304 10.726192
|
||||
v 16.042776 2.113304 14.677952
|
||||
v 16.089888 2.113304 16.831580
|
||||
v 19.224256 2.113304 17.948125
|
||||
v 20.913496 2.113304 18.048940
|
||||
v 23.017061 2.267616 17.647239
|
||||
v 24.156958 2.267616 15.394028
|
||||
v 21.793527 2.831559 13.329814
|
||||
v 20.646732 2.831559 12.496619
|
||||
v 18.767939 2.831559 12.297017
|
||||
v 17.621145 2.831559 13.130212
|
||||
v 17.183109 2.831559 14.478349
|
||||
v 17.882949 2.831559 16.440047
|
||||
v 19.491020 2.831559 17.472844
|
||||
v 20.646732 2.831559 16.859284
|
||||
v 22.145496 2.985870 16.026090
|
||||
v 22.583532 2.985870 14.677952
|
||||
v 20.913496 2.908714 13.969194
|
||||
v 20.310590 2.908714 13.531157
|
||||
v 19.104081 2.908714 13.331555
|
||||
v 18.501176 2.908714 13.769591
|
||||
v 18.270887 2.908714 14.478349
|
||||
v 18.501176 2.908714 15.187107
|
||||
v 19.565358 2.908714 15.824746
|
||||
v 20.310591 2.908714 15.824746
|
||||
v 20.913496 2.908714 15.386710
|
||||
v 21.143785 2.908714 14.677952
|
||||
vt 0.000000 0.500000
|
||||
vt 0.100000 0.500000
|
||||
vt 0.200000 0.500000
|
||||
vt 0.300000 0.500000
|
||||
vt 0.400000 0.500000
|
||||
vt 0.500000 0.500000
|
||||
vt 0.600000 0.500000
|
||||
vt 0.700000 0.500000
|
||||
vt 0.800000 0.500000
|
||||
vt 0.900000 0.500000
|
||||
vt 1.000000 0.500000
|
||||
vt 0.000000 0.600000
|
||||
vt 0.100000 0.600000
|
||||
vt 0.200000 0.600000
|
||||
vt 0.300000 0.600000
|
||||
vt 0.400000 0.600000
|
||||
vt 0.500000 0.600000
|
||||
vt 0.600000 0.600000
|
||||
vt 0.700000 0.600000
|
||||
vt 0.800000 0.600000
|
||||
vt 0.900000 0.600000
|
||||
vt 1.000000 0.600000
|
||||
vt 0.000000 0.700000
|
||||
vt 0.100000 0.700000
|
||||
vt 0.200000 0.700000
|
||||
vt 0.300000 0.700000
|
||||
vt 0.400000 0.700000
|
||||
vt 0.500000 0.700000
|
||||
vt 0.600000 0.700000
|
||||
vt 0.700000 0.700000
|
||||
vt 0.800000 0.700000
|
||||
vt 0.900000 0.700000
|
||||
vt 1.000000 0.700000
|
||||
vt 0.000000 0.800000
|
||||
vt 0.100000 0.800000
|
||||
vt 0.200000 0.800000
|
||||
vt 0.300000 0.800000
|
||||
vt 0.400000 0.800000
|
||||
vt 0.500000 0.800000
|
||||
vt 0.600000 0.800000
|
||||
vt 0.700000 0.800000
|
||||
vt 0.800000 0.800000
|
||||
vt 0.900000 0.800000
|
||||
vt 1.000000 0.800000
|
||||
vt 0.000000 0.900000
|
||||
vt 0.100000 0.900000
|
||||
vt 0.200000 0.900000
|
||||
vt 0.300000 0.900000
|
||||
vt 0.400000 0.900000
|
||||
vt 0.500000 0.900000
|
||||
vt 0.600000 0.900000
|
||||
vt 0.700000 0.900000
|
||||
vt 0.800000 0.900000
|
||||
vt 0.900000 0.900000
|
||||
vt 1.000000 0.900000
|
||||
vn 0.547393 0.042224 -0.835810
|
||||
vn 0.547393 0.042224 -0.835810
|
||||
vn 0.547393 0.042224 -0.835810
|
||||
vn 0.547393 0.042224 -0.835810
|
||||
vn 0.025638 -0.000681 -0.999671
|
||||
vn 0.025638 -0.000681 -0.999671
|
||||
vn 0.025638 -0.000681 -0.999671
|
||||
vn 0.025638 -0.000681 -0.999671
|
||||
vn 0.000000 0.050455 -0.998726
|
||||
vn 0.000000 0.050455 -0.998726
|
||||
vn 0.000000 0.050455 -0.998726
|
||||
vn 0.000000 0.050455 -0.998726
|
||||
vn -0.957512 0.160965 -0.239293
|
||||
vn -0.957512 0.160965 -0.239293
|
||||
vn -0.957512 0.160965 -0.239293
|
||||
vn -0.957512 0.160965 -0.239293
|
||||
vn -0.987056 0.155459 0.039398
|
||||
vn -0.987056 0.155459 0.039398
|
||||
vn -0.987056 0.155459 0.039398
|
||||
vn -0.987056 0.155459 0.039398
|
||||
vn -0.799129 0.153659 0.581190
|
||||
vn -0.799129 0.153659 0.581190
|
||||
vn -0.799129 0.153659 0.581190
|
||||
vn -0.799129 0.153659 0.581190
|
||||
vn -0.019409 0.161311 0.986713
|
||||
vn -0.019409 0.161311 0.986713
|
||||
vn -0.019409 0.161311 0.986713
|
||||
vn -0.019409 0.161311 0.986713
|
||||
vn 0.027879 0.131795 0.990885
|
||||
vn 0.027879 0.131795 0.990885
|
||||
vn 0.027879 0.131795 0.990885
|
||||
vn 0.027879 0.131795 0.990885
|
||||
vn 0.893103 0.022697 0.449280
|
||||
vn 0.893103 0.022697 0.449280
|
||||
vn 0.893103 0.022697 0.449280
|
||||
vn 0.893103 0.022697 0.449280
|
||||
vn 1.000000 0.000000 0.000000
|
||||
vn 1.000000 0.000000 0.000000
|
||||
vn 1.000000 0.000000 0.000000
|
||||
vn 1.000000 0.000000 0.000000
|
||||
vn 0.378151 0.712684 -0.590832
|
||||
vn 0.378152 0.712685 -0.590832
|
||||
vn 0.378152 0.712684 -0.590832
|
||||
vn 0.378152 0.712684 -0.590832
|
||||
vn 0.043973 0.559611 -0.827588
|
||||
vn 0.043973 0.559611 -0.827588
|
||||
vn 0.043973 0.559610 -0.827588
|
||||
vn 0.043973 0.559610 -0.827588
|
||||
vn -0.016505 0.502086 -0.864660
|
||||
vn -0.016505 0.502086 -0.864660
|
||||
vn -0.016505 0.502086 -0.864660
|
||||
vn -0.016505 0.502086 -0.864660
|
||||
vn -0.896411 0.405025 -0.180007
|
||||
vn -0.896410 0.405025 -0.180007
|
||||
vn -0.896410 0.405025 -0.180007
|
||||
vn -0.896410 0.405025 -0.180007
|
||||
vn -0.835724 0.548662 0.023149
|
||||
vn -0.835724 0.548662 0.023149
|
||||
vn -0.835724 0.548662 0.023149
|
||||
vn -0.835724 0.548662 0.023149
|
||||
vn -0.338358 0.769199 0.542077
|
||||
vn -0.338358 0.769199 0.542077
|
||||
vn -0.338358 0.769199 0.542077
|
||||
vn -0.338358 0.769199 0.542077
|
||||
vn -0.026169 0.521080 0.853107
|
||||
vn -0.026169 0.521080 0.853107
|
||||
vn -0.026169 0.521080 0.853107
|
||||
vn -0.026169 0.521080 0.853107
|
||||
vn 0.051874 0.589498 0.806103
|
||||
vn 0.051874 0.589498 0.806103
|
||||
vn 0.051874 0.589498 0.806103
|
||||
vn 0.051874 0.589498 0.806103
|
||||
vn 0.521020 0.811123 0.265739
|
||||
vn 0.521020 0.811123 0.265739
|
||||
vn 0.521020 0.811123 0.265739
|
||||
vn 0.521020 0.811123 0.265739
|
||||
vn 0.577912 0.816021 -0.011268
|
||||
vn 0.577912 0.816021 -0.011268
|
||||
vn 0.577912 0.816021 -0.011268
|
||||
vn 0.577912 0.816021 -0.011268
|
||||
vn 0.198414 0.929477 -0.310974
|
||||
vn 0.198414 0.929477 -0.310974
|
||||
vn 0.198414 0.929477 -0.310974
|
||||
vn 0.198414 0.929477 -0.310974
|
||||
vn 0.039620 0.914981 -0.401548
|
||||
vn 0.039620 0.914981 -0.401548
|
||||
vn 0.039620 0.914981 -0.401548
|
||||
vn 0.039620 0.914981 -0.401548
|
||||
vn -0.486574 0.868666 -0.093084
|
||||
vn -0.486574 0.868666 -0.093084
|
||||
vn -0.486574 0.868666 -0.093084
|
||||
vn -0.486574 0.868666 -0.093084
|
||||
vn -0.425881 0.901471 0.077299
|
||||
vn -0.425881 0.901471 0.077299
|
||||
vn -0.425881 0.901471 0.077299
|
||||
vn -0.425881 0.901471 0.077299
|
||||
vn -0.272010 0.752195 0.600178
|
||||
vn -0.272009 0.752195 0.600178
|
||||
vn -0.272010 0.752195 0.600178
|
||||
vn -0.272009 0.752195 0.600178
|
||||
vn 0.116929 0.751942 0.648776
|
||||
vn 0.116929 0.751942 0.648776
|
||||
vn 0.116929 0.751942 0.648776
|
||||
vn 0.116929 0.751942 0.648776
|
||||
vn 0.070712 0.899536 0.431086
|
||||
vn 0.070712 0.899536 0.431086
|
||||
vn 0.070712 0.899536 0.431086
|
||||
vn 0.070712 0.899536 0.431086
|
||||
vn 0.377324 0.911205 0.165325
|
||||
vn 0.377324 0.911205 0.165325
|
||||
vn 0.377324 0.911205 0.165325
|
||||
vn 0.377324 0.911205 0.165325
|
||||
vn 0.333702 0.934101 -0.126878
|
||||
vn 0.333702 0.934101 -0.126878
|
||||
vn 0.333702 0.934101 -0.126878
|
||||
vn 0.333702 0.934101 -0.126878
|
||||
vn 0.043715 0.997230 -0.060169
|
||||
vn 0.043715 0.997230 -0.060169
|
||||
vn 0.043715 0.997231 -0.060169
|
||||
vn 0.043715 0.997231 -0.060169
|
||||
vn 0.009623 0.997184 -0.074369
|
||||
vn 0.009623 0.997184 -0.074369
|
||||
vn 0.009623 0.997184 -0.074369
|
||||
vn 0.009623 0.997184 -0.074369
|
||||
vn -0.043715 0.997230 -0.060169
|
||||
vn -0.043715 0.997230 -0.060169
|
||||
vn -0.043715 0.997231 -0.060169
|
||||
vn -0.043715 0.997230 -0.060169
|
||||
vn -0.070733 0.997230 -0.022982
|
||||
vn -0.070733 0.997230 -0.022982
|
||||
vn -0.070733 0.997230 -0.022982
|
||||
vn -0.070733 0.997230 -0.022982
|
||||
vn -0.071818 0.997104 0.025014
|
||||
vn -0.071818 0.997104 0.025014
|
||||
vn -0.071818 0.997104 0.025014
|
||||
vn -0.071818 0.997104 0.025014
|
||||
vn -0.028890 0.998514 0.046216
|
||||
vn -0.028890 0.998514 0.046216
|
||||
vn -0.028890 0.998514 0.046216
|
||||
vn -0.028890 0.998514 0.046216
|
||||
vn 0.017968 0.998288 0.055670
|
||||
vn 0.017968 0.998288 0.055670
|
||||
vn 0.017968 0.998288 0.055670
|
||||
vn 0.017968 0.998288 0.055670
|
||||
vn -0.046770 0.997944 0.043815
|
||||
vn -0.046770 0.997944 0.043815
|
||||
vn -0.046770 0.997944 0.043815
|
||||
vn -0.046770 0.997944 0.043815
|
||||
vn -0.053505 0.998416 -0.017385
|
||||
vn -0.053505 0.998416 -0.017385
|
||||
vn -0.053505 0.998416 -0.017385
|
||||
vn -0.053505 0.998416 -0.017385
|
||||
vn -0.018148 0.997665 -0.065844
|
||||
vn -0.018148 0.997665 -0.065844
|
||||
vn -0.018148 0.997665 -0.065844
|
||||
vn -0.018148 0.997665 -0.065844
|
||||
vn -0.079865 0.943343 -0.322064
|
||||
vn -0.079865 0.943343 -0.322064
|
||||
vn -0.079865 0.943343 -0.322064
|
||||
vn -0.079865 0.943343 -0.322064
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
s off
|
||||
g pasted__pasted__pSphere4 pasted__pasted__pSphere1SmoothProxyGroup pasted__group group2
|
||||
usemtl pasted__pasted__lambert3SG1
|
||||
f 1/1/1 2/2/2 12/13/3 11/12/4
|
||||
f 2/2/5 3/3/6 13/14/7 12/13/8
|
||||
f 3/3/9 4/4/10 14/15/11 13/14/12
|
||||
f 4/4/13 5/5/14 15/16/15 14/15/16
|
||||
f 5/5/17 6/6/18 16/17/19 15/16/20
|
||||
f 6/6/21 7/7/22 17/18/23 16/17/24
|
||||
f 7/7/25 8/8/26 18/19/27 17/18/28
|
||||
f 8/8/29 9/9/30 19/20/31 18/19/32
|
||||
f 9/9/33 10/10/34 20/21/35 19/20/36
|
||||
f 10/10/37 1/11/38 11/22/39 20/21/40
|
||||
f 11/12/41 12/13/42 22/24/43 21/23/44
|
||||
f 12/13/45 13/14/46 23/25/47 22/24/48
|
||||
f 13/14/49 14/15/50 24/26/51 23/25/52
|
||||
f 14/15/53 15/16/54 25/27/55 24/26/56
|
||||
f 15/16/57 16/17/58 26/28/59 25/27/60
|
||||
f 16/17/61 17/18/62 27/29/63 26/28/64
|
||||
f 17/18/65 18/19/66 28/30/67 27/29/68
|
||||
f 18/19/69 19/20/70 29/31/71 28/30/72
|
||||
f 19/20/73 20/21/74 30/32/75 29/31/76
|
||||
f 20/21/77 11/22/78 21/33/79 30/32/80
|
||||
f 21/23/81 22/24/82 32/35/83 31/34/84
|
||||
f 22/24/85 23/25/86 33/36/87 32/35/88
|
||||
f 24/26/89 25/27/90 35/38/91 34/37/92
|
||||
f 25/27/93 26/28/94 36/39/95 35/38/96
|
||||
f 26/28/97 27/29/98 37/40/99 36/39/100
|
||||
f 27/29/101 28/30/102 38/41/103 37/40/104
|
||||
f 28/30/105 29/31/106 39/42/107 38/41/108
|
||||
f 29/31/109 30/32/110 40/43/111 39/42/112
|
||||
f 30/32/113 21/33/114 31/44/115 40/43/116
|
||||
f 31/34/117 32/35/118 42/46/119 41/45/120
|
||||
f 32/35/121 33/36/122 43/47/123 42/46/124
|
||||
f 33/36/125 34/37/126 44/48/127 43/47/128
|
||||
f 34/37/129 35/38/130 45/49/131 44/48/132
|
||||
f 35/38/133 36/39/134 46/50/135 45/49/136
|
||||
f 36/39/137 37/40/138 47/51/139 46/50/140
|
||||
f 37/40/141 38/41/142 48/52/143 47/51/144
|
||||
f 38/41/145 39/42/146 49/53/147 48/52/148
|
||||
f 39/42/149 40/43/150 50/54/151 49/53/152
|
||||
f 40/43/153 31/44/154 41/55/155 50/54/156
|
||||
f 34/37/157 33/36/158 23/25/159 24/26/160
|
||||
f 42/46/161 43/47/162 44/48/163 45/49/164 46/50/165 47/51/166 48/52/167 49/53/168 50/54/169 41/45/170
|
||||
f 5/5/171 4/4/172 3/3/173 2/2/174 1/11/175 10/10/176 9/9/177 8/8/178 7/7/179 6/6/180
|
||||
@@ -1,7 +1,73 @@
|
||||
newmtl Rock14:lambert6SG
|
||||
newmtl Rock1:pasted__pasted__lambert3SG1
|
||||
illum 4
|
||||
Kd 0.45 0.45 0.45
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl Rock2:pasted__pasted__lambert3SG1
|
||||
illum 4
|
||||
Kd 0.45 0.45 0.45
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl Rock3:pasted__pasted__lambert3SG1
|
||||
illum 4
|
||||
Kd 0.45 0.45 0.45
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl Rock4:pasted__pasted__lambert3SG1
|
||||
illum 4
|
||||
Kd 0.45 0.45 0.45
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl initialShadingGroup
|
||||
illum 4
|
||||
Kd 0.50 0.50 0.50
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert2SG
|
||||
illum 4
|
||||
Kd 0.11 0.07 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert3SG
|
||||
illum 4
|
||||
Kd 0.50 0.35 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert4SG
|
||||
illum 4
|
||||
Kd 0.13 0.14 0.16
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl lambert5SG
|
||||
illum 4
|
||||
Kd 0.00 0.00 0.00
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
map_Kd Stones.png
|
||||
map_Kd Naamloos.png
|
||||
Ni 1.00
|
||||
newmtl lambert6SG
|
||||
illum 4
|
||||
Kd 0.89 0.89 0.89
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl pasted__lambert4SG
|
||||
illum 4
|
||||
Kd 0.13 0.14 0.16
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
newmtl pasted__pasted__lambert3SG1
|
||||
illum 4
|
||||
Kd 0.45 0.45 0.45
|
||||
Ka 0.00 0.00 0.00
|
||||
Tf 1.00 1.00 1.00
|
||||
Ni 1.00
|
||||
|
||||
@@ -1,737 +0,0 @@
|
||||
# This file uses centimeters as units for non-parametric coordinates.
|
||||
|
||||
mtllib Rock10.mtl
|
||||
g Rock14:default1
|
||||
v 4.941558 0.000000 -3.356660
|
||||
v 2.216577 0.000000 -5.336667
|
||||
v -1.151898 0.000000 -6.543634
|
||||
v -4.489141 0.000000 -4.563631
|
||||
v -5.530008 0.000000 -0.153030
|
||||
v -4.965517 0.000000 3.266693
|
||||
v -2.240540 0.000000 5.819403
|
||||
v 2.216577 0.000000 5.603078
|
||||
v 5.729727 0.000000 4.689539
|
||||
v 6.770609 0.000000 1.485886
|
||||
v 4.725860 1.551832 -3.199978
|
||||
v 2.134023 1.551832 -5.082932
|
||||
v -1.069599 1.551832 -6.289903
|
||||
v -4.273440 1.551832 -4.406953
|
||||
v -5.263417 1.551832 -0.153030
|
||||
v -4.749804 1.551832 3.110022
|
||||
v -2.157975 1.551832 5.565672
|
||||
v 2.134027 1.551832 5.349388
|
||||
v 6.132498 1.551832 4.532609
|
||||
v 7.122502 1.551832 1.485886
|
||||
v 4.609601 2.951764 -3.527630
|
||||
v 1.894824 2.951764 -4.346659
|
||||
v -0.830175 2.951764 -4.346659
|
||||
v -3.034848 2.951764 -2.744829
|
||||
v -3.877123 2.951764 -0.153030
|
||||
v -2.669389 2.951764 3.295645
|
||||
v -0.464708 2.951764 4.897482
|
||||
v 1.894824 2.951764 5.076090
|
||||
v 5.736745 3.167297 4.096554
|
||||
v 7.128675 3.167297 0.549275
|
||||
v 9.380221 12.995994 -2.142035
|
||||
v 7.268513 12.995994 -2.523037
|
||||
v 4.644403 12.995994 -2.801839
|
||||
v 3.042603 12.995994 -1.638022
|
||||
v 2.430769 12.995994 0.244891
|
||||
v 3.408291 12.995994 2.984904
|
||||
v 5.654229 12.995994 4.427516
|
||||
v 7.268513 12.995994 4.606150
|
||||
v 9.888848 16.207621 4.064604
|
||||
v 11.050520 16.207621 1.225952
|
||||
v 11.146457 20.527525 -0.466318
|
||||
v 6.799099 16.705383 -1.078148
|
||||
v 5.113851 16.705383 -1.356947
|
||||
v 6.527206 18.970072 -0.745113
|
||||
v 3.950029 16.705383 0.244891
|
||||
v 4.271805 16.705383 1.234890
|
||||
v 8.013615 18.970072 2.125519
|
||||
v 10.304179 20.527525 2.125519
|
||||
v 11.146457 20.527525 1.513685
|
||||
v 11.467955 20.527525 0.523689
|
||||
v 8.261353 10.640221 -2.467143
|
||||
v 6.008127 10.640221 -2.950703
|
||||
v 3.360358 10.640221 -3.164116
|
||||
v 1.617198 10.640221 -1.897761
|
||||
v 0.951300 10.640221 0.151621
|
||||
v 1.982890 10.640221 3.057836
|
||||
v 4.219123 10.640221 4.537617
|
||||
v 6.008127 10.640221 4.716229
|
||||
v 8.914913 10.855755 4.072155
|
||||
v 10.130692 10.855755 1.067302
|
||||
v 6.796928 7.556904 -2.892291
|
||||
v 4.358688 7.556904 -3.510479
|
||||
v 1.679829 7.556904 -3.638317
|
||||
v 2.573993 7.556904 2.717865
|
||||
v 2.340926 7.556904 4.681991
|
||||
v 4.358688 7.556904 4.860621
|
||||
v 7.640401 7.772439 4.081931
|
||||
v 8.926703 7.772439 0.859490
|
||||
v 5.351103 4.513199 -3.312176
|
||||
v 2.730303 4.513199 -4.063093
|
||||
v 0.020861 4.513199 -4.106597
|
||||
v -2.090257 7.289964 -2.572875
|
||||
v -1.724568 4.513199 3.247227
|
||||
v 0.486695 4.513199 4.824448
|
||||
v 2.730303 4.513199 5.003041
|
||||
v 6.382096 4.728737 4.091621
|
||||
v 7.738359 4.728737 0.654387
|
||||
v -2.122515 7.075274 -2.583402
|
||||
v -2.928914 7.310737 -0.101862
|
||||
v 1.191261 11.557831 -0.697826
|
||||
v 0.930335 11.624486 -2.247872
|
||||
v -0.377845 11.514683 -3.470086
|
||||
v -1.184018 11.750146 -0.988564
|
||||
v 2.387160 15.982284 -0.236283
|
||||
v 2.834054 15.801111 -3.378349
|
||||
v 1.181372 11.543352 -0.698484
|
||||
v 0.543115 12.634959 -3.302434
|
||||
v -0.228444 12.752694 -0.928192
|
||||
v 1.083369 11.561172 -0.642263
|
||||
v 2.116365 13.181708 -2.473666
|
||||
v 1.227987 11.557164 -0.810892
|
||||
v 3.411045 12.993238 2.980508
|
||||
v 5.651475 12.998750 4.431911
|
||||
v 8.016369 18.967314 2.121123
|
||||
v 4.269051 16.708139 1.239282
|
||||
vt 0.747022 0.464579
|
||||
vt 0.853638 0.464579
|
||||
vt 0.853638 0.502091
|
||||
vt 0.750810 0.502091
|
||||
vt 0.936302 0.464579
|
||||
vt 0.932515 0.502091
|
||||
vt 0.853638 0.535931
|
||||
vt 0.790988 0.535931
|
||||
vt 0.699160 0.464579
|
||||
vt 0.705294 0.502091
|
||||
vt 0.998008 0.464579
|
||||
vt 0.991875 0.502091
|
||||
vt 0.937002 0.535931
|
||||
vt 0.854875 0.641299
|
||||
vt 0.794890 0.635607
|
||||
vt 0.795144 0.640797
|
||||
vt 0.861003 0.721782
|
||||
vt 0.935832 0.573675
|
||||
vt 0.923036 0.647250
|
||||
vt 0.931253 0.721782
|
||||
vt 0.833441 0.748612
|
||||
vt 0.773456 0.742920
|
||||
vt 0.975723 0.535931
|
||||
vt 0.973957 0.573675
|
||||
vt 0.970514 0.647250
|
||||
vt 0.967024 0.721782
|
||||
vt 0.929491 0.778727
|
||||
vt 0.863257 0.778727
|
||||
vt 0.834901 0.772846
|
||||
vt 0.777509 0.770000
|
||||
vt 0.964362 0.778727
|
||||
vt 0.887188 0.868393
|
||||
vt 0.863257 0.868393
|
||||
vt 0.851626 0.850914
|
||||
vt 0.775674 0.846534
|
||||
vt 0.908717 0.923136
|
||||
vt 0.839326 0.923136
|
||||
vt 0.001992 0.001895
|
||||
vt 0.079433 0.001895
|
||||
vt 0.079433 0.039407
|
||||
vt 0.005786 0.039407
|
||||
vt 0.196490 0.001895
|
||||
vt 0.192703 0.039407
|
||||
vt 0.102073 0.078457
|
||||
vt 0.016326 0.078457
|
||||
vt 0.244352 0.001895
|
||||
vt 0.238219 0.039407
|
||||
vt 0.200623 0.073247
|
||||
vt 0.099532 0.116201
|
||||
vt 0.016445 0.116201
|
||||
vt 0.195415 0.110991
|
||||
vt 0.094575 0.189775
|
||||
vt 0.016680 0.189775
|
||||
vt 0.185265 0.184565
|
||||
vt 0.089551 0.264307
|
||||
vt 0.016916 0.264307
|
||||
vt 0.174988 0.259097
|
||||
vt 0.085716 0.393676
|
||||
vt 0.017098 0.393676
|
||||
vt 0.167129 0.316043
|
||||
vt 0.102692 0.498100
|
||||
vt 0.078761 0.498100
|
||||
vt 0.126623 0.498100
|
||||
vt 0.063393 0.559036
|
||||
vt 0.108908 0.559036
|
||||
vt 0.108908 0.648702
|
||||
vt 0.084977 0.703446
|
||||
vt 0.057115 0.502091
|
||||
vt 0.106654 0.502091
|
||||
vt 0.035261 0.559036
|
||||
vt 0.070187 0.648702
|
||||
vt 0.026503 0.502091
|
||||
vt 0.163636 0.610527
|
||||
vt 0.207905 0.649700
|
||||
vt 0.229774 0.713018
|
||||
vt 0.153822 0.717397
|
||||
vt 0.167712 0.610430
|
||||
vt 0.202447 0.612058
|
||||
vt 0.210558 0.502091
|
||||
vt 0.231991 0.609403
|
||||
vt 0.227939 0.636484
|
||||
vt 0.144445 0.588265
|
||||
vt 0.193984 0.588265
|
||||
vt 0.270374 0.804930
|
||||
vt 0.214729 0.949340
|
||||
vt 0.214623 0.949273
|
||||
vt 0.270481 0.804997
|
||||
vt 0.424535 0.894663
|
||||
vt 0.382233 0.804997
|
||||
vt 0.382339 0.804930
|
||||
vt 0.424429 0.894729
|
||||
vt 0.087686 0.784877
|
||||
vt 0.042170 0.862323
|
||||
vt 0.001992 0.832383
|
||||
vt 0.040713 0.779090
|
||||
vt 0.058510 0.707437
|
||||
vt 0.040713 0.713219
|
||||
vt 0.486186 0.806273
|
||||
vt 0.487074 0.809006
|
||||
vt 0.483578 0.804930
|
||||
vt 0.339641 0.812702
|
||||
vt 0.276989 0.833062
|
||||
vt 0.291779 0.812702
|
||||
vt 0.315710 0.804930
|
||||
vt 0.346380 0.924361
|
||||
vt 0.276989 0.888431
|
||||
vt 0.263287 0.549953
|
||||
vt 0.343957 0.502091
|
||||
vt 0.425382 0.531267
|
||||
vt 0.491252 0.579129
|
||||
vt 0.535465 0.696186
|
||||
vt 0.510305 0.773627
|
||||
vt 0.425382 0.795709
|
||||
vt 0.317642 0.800939
|
||||
vt 0.251772 0.739233
|
||||
vt 0.238127 0.656569
|
||||
vt 0.468468 0.804930
|
||||
vt 0.468468 0.886355
|
||||
vt 0.430956 0.884366
|
||||
vt 0.430956 0.806926
|
||||
vt 0.312308 0.001895
|
||||
vt 0.420049 0.001895
|
||||
vt 0.418053 0.039407
|
||||
vt 0.314304 0.039407
|
||||
vt 0.504971 0.001895
|
||||
vt 0.514707 0.039407
|
||||
vt 0.412271 0.073247
|
||||
vt 0.355235 0.073247
|
||||
vt 0.505141 0.078457
|
||||
vt 0.432467 0.110991
|
||||
vt 0.378233 0.110991
|
||||
vt 0.251653 0.039407
|
||||
vt 0.301942 0.073247
|
||||
vt 0.520740 0.116201
|
||||
vt 0.471829 0.184565
|
||||
vt 0.423055 0.184565
|
||||
vt 0.551157 0.189775
|
||||
vt 0.511701 0.259097
|
||||
vt 0.468456 0.259097
|
||||
vt 0.581965 0.264307
|
||||
vt 0.542167 0.316043
|
||||
vt 0.503146 0.316043
|
||||
vt 0.605508 0.393676
|
||||
vt 0.615548 0.498100
|
||||
vt 0.560179 0.460452
|
||||
vt 0.635908 0.498100
|
||||
vt 0.830989 0.460588
|
||||
vt 0.768338 0.460588
|
||||
vt 0.762555 0.426748
|
||||
vt 0.828179 0.426748
|
||||
vt 0.782751 0.389004
|
||||
vt 0.846103 0.389004
|
||||
vt 0.696685 0.426748
|
||||
vt 0.717257 0.389004
|
||||
vt 0.822114 0.315429
|
||||
vt 0.881052 0.315429
|
||||
vt 0.739241 0.217105
|
||||
vt 0.755845 0.240897
|
||||
vt 0.797981 0.240897
|
||||
vt 0.757358 0.315429
|
||||
vt 0.643392 0.426748
|
||||
vt 0.666225 0.321882
|
||||
vt 0.665446 0.327072
|
||||
vt 0.861985 0.240897
|
||||
vt 0.916451 0.240897
|
||||
vt 0.892452 0.183952
|
||||
vt 0.943497 0.183952
|
||||
vt 0.829020 0.183952
|
||||
vt 0.881105 0.094286
|
||||
vt 0.986192 0.001895
|
||||
vt 0.840368 0.094286
|
||||
vt 0.874533 0.039543
|
||||
vt 0.095737 0.721389
|
||||
vt 0.149894 0.721522
|
||||
vt 0.207060 0.865798
|
||||
vt 0.116477 0.811188
|
||||
vt 0.564521 0.607459
|
||||
vt 0.663878 0.709773
|
||||
vt 0.664117 0.710123
|
||||
vt 0.661509 0.710203
|
||||
vt 0.693025 0.817074
|
||||
vt 0.629799 0.739006
|
||||
vt 0.606700 0.714772
|
||||
vt 0.541601 0.502091
|
||||
vt 0.475849 0.859220
|
||||
vt 0.475849 0.804930
|
||||
vt 0.475916 0.804997
|
||||
vt 0.475782 0.859154
|
||||
vt 0.117761 0.709773
|
||||
vt 0.130946 0.502091
|
||||
vt 0.138310 0.687942
|
||||
vt 0.115043 0.710107
|
||||
vt 0.117776 0.710123
|
||||
vt 0.374527 0.804997
|
||||
vt 0.352998 0.895446
|
||||
vt 0.353105 0.895513
|
||||
vt 0.374421 0.804930
|
||||
vn 0.580093 0.161325 -0.798415
|
||||
vn 0.580093 0.161325 -0.798415
|
||||
vn 0.580093 0.161325 -0.798415
|
||||
vn 0.580093 0.161325 -0.798415
|
||||
vn 0.340787 0.151731 -0.927816
|
||||
vn 0.340787 0.151731 -0.927816
|
||||
vn 0.340787 0.151731 -0.927816
|
||||
vn 0.340787 0.151731 -0.927816
|
||||
vn -0.501913 0.160575 -0.849882
|
||||
vn -0.501913 0.160575 -0.849882
|
||||
vn -0.501913 0.160575 -0.849882
|
||||
vn -0.501913 0.160575 -0.849882
|
||||
vn -0.960961 0.160697 -0.225236
|
||||
vn -0.960961 0.160697 -0.225236
|
||||
vn -0.960961 0.160697 -0.225236
|
||||
vn -0.960961 0.160697 -0.225236
|
||||
vn -0.974614 0.159392 0.157230
|
||||
vn -0.974614 0.159392 0.157230
|
||||
vn -0.974614 0.159392 0.157230
|
||||
vn -0.974614 0.159392 0.157230
|
||||
vn -0.676838 0.160059 0.718521
|
||||
vn -0.676837 0.160059 0.718521
|
||||
vn -0.676838 0.160059 0.718521
|
||||
vn -0.676838 0.160059 0.718521
|
||||
vn 0.048741 0.161157 0.985725
|
||||
vn 0.048741 0.161157 0.985724
|
||||
vn 0.048741 0.161157 0.985725
|
||||
vn 0.048741 0.161157 0.985725
|
||||
vn 0.223228 0.105179 0.969075
|
||||
vn 0.223228 0.105179 0.969075
|
||||
vn 0.223228 0.105179 0.969075
|
||||
vn 0.223228 0.105179 0.969075
|
||||
vn 0.929688 -0.210783 0.302077
|
||||
vn 0.929688 -0.210783 0.302077
|
||||
vn 0.929688 -0.210783 0.302077
|
||||
vn 0.929688 -0.210783 0.302077
|
||||
vn 0.913961 -0.019642 -0.405326
|
||||
vn 0.913961 -0.019642 -0.405326
|
||||
vn 0.913961 -0.019642 -0.405326
|
||||
vn 0.913961 -0.019642 -0.405326
|
||||
vn 0.445958 0.184438 -0.875845
|
||||
vn 0.445958 0.184438 -0.875845
|
||||
vn 0.445958 0.184438 -0.875845
|
||||
vn 0.445958 0.184438 -0.875845
|
||||
vn 0.145517 0.684044 -0.714779
|
||||
vn 0.145517 0.684043 -0.714779
|
||||
vn 0.145517 0.684044 -0.714779
|
||||
vn 0.145517 0.684044 -0.714779
|
||||
vn -0.319574 0.807382 -0.495990
|
||||
vn -0.319574 0.807382 -0.495990
|
||||
vn -0.319574 0.807382 -0.495990
|
||||
vn -0.319574 0.807382 -0.495990
|
||||
vn -0.663181 0.727107 -0.177500
|
||||
vn -0.663181 0.727107 -0.177500
|
||||
vn -0.663181 0.727107 -0.177500
|
||||
vn -0.663181 0.727107 -0.177500
|
||||
vn -0.625363 0.763674 0.160386
|
||||
vn -0.625363 0.763674 0.160386
|
||||
vn -0.625363 0.763674 0.160386
|
||||
vn -0.625363 0.763674 0.160386
|
||||
vn -0.456209 0.707833 0.539302
|
||||
vn -0.456209 0.707833 0.539302
|
||||
vn -0.456209 0.707833 0.539302
|
||||
vn -0.456209 0.707833 0.539302
|
||||
vn 0.005373 0.316213 0.948673
|
||||
vn 0.005373 0.316213 0.948673
|
||||
vn 0.005373 0.316213 0.948673
|
||||
vn 0.005373 0.316213 0.948673
|
||||
vn 0.208383 0.265331 0.941369
|
||||
vn 0.208383 0.265331 0.941369
|
||||
vn 0.208383 0.265331 0.941369
|
||||
vn 0.208383 0.265331 0.941369
|
||||
vn 0.910753 0.249590 0.328989
|
||||
vn 0.910753 0.249590 0.328989
|
||||
vn 0.910753 0.249590 0.328989
|
||||
vn 0.910753 0.249590 0.328989
|
||||
vn 0.861311 -0.169390 -0.479010
|
||||
vn 0.861311 -0.169390 -0.479010
|
||||
vn 0.861311 -0.169390 -0.479010
|
||||
vn 0.861311 -0.169390 -0.479010
|
||||
vn 0.193963 0.058511 -0.979262
|
||||
vn 0.193963 0.058511 -0.979262
|
||||
vn 0.193963 0.058511 -0.979262
|
||||
vn 0.193963 0.058511 -0.979262
|
||||
vn 0.092333 0.115944 -0.988955
|
||||
vn 0.092333 0.115944 -0.988955
|
||||
vn 0.092333 0.115944 -0.988955
|
||||
vn 0.092333 0.115944 -0.988955
|
||||
vn -0.812090 0.520461 -0.263876
|
||||
vn -0.812090 0.520461 -0.263876
|
||||
vn -0.812090 0.520461 -0.263876
|
||||
vn -0.812090 0.520461 -0.263876
|
||||
vn -0.815180 0.501341 0.290067
|
||||
vn -0.815180 0.501341 0.290067
|
||||
vn -0.815180 0.501341 0.290067
|
||||
vn -0.815180 0.501341 0.290067
|
||||
vn -0.513202 0.342157 0.787116
|
||||
vn -0.513202 0.342157 0.787116
|
||||
vn -0.513202 0.342157 0.787116
|
||||
vn -0.513202 0.342158 0.787116
|
||||
vn -0.103818 0.105609 0.988973
|
||||
vn -0.103818 0.105609 0.988973
|
||||
vn -0.103818 0.105609 0.988973
|
||||
vn -0.103818 0.105609 0.988973
|
||||
vn 0.242147 -0.055410 0.968656
|
||||
vn 0.242147 -0.055411 0.968656
|
||||
vn 0.242147 -0.055411 0.968656
|
||||
vn 0.242147 -0.055410 0.968656
|
||||
vn 0.913291 -0.166829 0.371576
|
||||
vn 0.913291 -0.166829 0.371576
|
||||
vn 0.913291 -0.166829 0.371575
|
||||
vn 0.913291 -0.166829 0.371576
|
||||
vn 0.908139 -0.217763 -0.357580
|
||||
vn 0.908139 -0.217763 -0.357580
|
||||
vn 0.908139 -0.217763 -0.357580
|
||||
vn 0.908139 -0.217763 -0.357580
|
||||
vn -0.010919 0.268649 -0.963176
|
||||
vn -0.010919 0.268649 -0.963176
|
||||
vn -0.010919 0.268649 -0.963176
|
||||
vn -0.010919 0.268649 -0.963176
|
||||
vn 0.119702 0.360348 -0.925106
|
||||
vn 0.119702 0.360348 -0.925106
|
||||
vn 0.119702 0.360348 -0.925106
|
||||
vn 0.119702 0.360348 -0.925106
|
||||
vn -0.672113 0.421426 -0.608822
|
||||
vn -0.672113 0.421426 -0.608822
|
||||
vn -0.672113 0.421426 -0.608822
|
||||
vn -0.672113 0.421426 -0.608822
|
||||
vn -0.753306 0.434767 -0.493465
|
||||
vn -0.753306 0.434767 -0.493465
|
||||
vn -0.753306 0.434767 -0.493465
|
||||
vn -0.753306 0.434767 -0.493465
|
||||
vn -0.882496 0.355954 0.307406
|
||||
vn -0.882496 0.355954 0.307406
|
||||
vn -0.882496 0.355954 0.307406
|
||||
vn -0.882496 0.355954 0.307406
|
||||
vn -0.469028 0.469202 0.748239
|
||||
vn -0.469028 0.469202 0.748239
|
||||
vn -0.469028 0.469202 0.748239
|
||||
vn -0.469028 0.469202 0.748239
|
||||
vn -0.199289 0.396892 0.895969
|
||||
vn -0.199289 0.396892 0.895969
|
||||
vn -0.199289 0.396892 0.895969
|
||||
vn -0.199289 0.396892 0.895969
|
||||
vn -0.082817 0.414718 0.906174
|
||||
vn -0.082817 0.414718 0.906174
|
||||
vn -0.082817 0.414718 0.906174
|
||||
vn -0.082817 0.414718 0.906174
|
||||
vn 0.931544 -0.044725 0.360868
|
||||
vn 0.931544 -0.044725 0.360868
|
||||
vn 0.931544 -0.044725 0.360868
|
||||
vn 0.931544 -0.044725 0.360868
|
||||
vn 0.936043 -0.146178 -0.320088
|
||||
vn 0.936043 -0.146178 -0.320088
|
||||
vn 0.936043 -0.146178 -0.320088
|
||||
vn 0.936043 -0.146178 -0.320088
|
||||
vn -0.537039 0.406421 -0.739196
|
||||
vn -0.537039 0.406421 -0.739196
|
||||
vn -0.537039 0.406421 -0.739196
|
||||
vn -0.537039 0.406421 -0.739196
|
||||
vn -0.559499 0.786314 0.262050
|
||||
vn -0.559501 0.786314 0.262050
|
||||
vn -0.559501 0.786313 0.262050
|
||||
vn -0.559500 0.786314 0.262050
|
||||
vn 0.228437 0.040013 -0.972736
|
||||
vn 0.228437 0.040013 -0.972736
|
||||
vn 0.228437 0.040013 -0.972736
|
||||
vn 0.228437 0.040013 -0.972736
|
||||
vn 0.063378 0.131650 -0.989268
|
||||
vn 0.063378 0.131650 -0.989268
|
||||
vn 0.063378 0.131650 -0.989268
|
||||
vn 0.063378 0.131650 -0.989268
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.729418 0.456374 0.509580
|
||||
vn -0.852950 0.162291 0.496123
|
||||
vn -0.852950 0.162291 0.496123
|
||||
vn -0.852950 0.162291 0.496123
|
||||
vn -0.852950 0.162291 0.496123
|
||||
vn -0.092971 0.099574 0.990677
|
||||
vn -0.092971 0.099574 0.990677
|
||||
vn -0.092971 0.099574 0.990677
|
||||
vn -0.092971 0.099574 0.990677
|
||||
vn 0.228834 -0.084257 0.969812
|
||||
vn 0.228834 -0.084257 0.969812
|
||||
vn 0.228834 -0.084257 0.969812
|
||||
vn 0.228834 -0.084257 0.969812
|
||||
vn 0.865966 -0.359223 0.347939
|
||||
vn 0.865966 -0.359223 0.347939
|
||||
vn 0.865966 -0.359223 0.347939
|
||||
vn 0.865966 -0.359223 0.347939
|
||||
vn 0.839017 -0.317721 -0.441705
|
||||
vn 0.839017 -0.317721 -0.441705
|
||||
vn 0.839017 -0.317721 -0.441705
|
||||
vn 0.839017 -0.317721 -0.441705
|
||||
vn 0.261162 0.022280 -0.965038
|
||||
vn 0.261162 0.022280 -0.965038
|
||||
vn 0.261162 0.022280 -0.965038
|
||||
vn 0.261162 0.022280 -0.965038
|
||||
vn 0.031431 0.148783 -0.988370
|
||||
vn 0.031431 0.148783 -0.988370
|
||||
vn 0.031431 0.148783 -0.988370
|
||||
vn 0.031431 0.148783 -0.988370
|
||||
vn -0.767469 0.608270 -0.202480
|
||||
vn -0.767469 0.608270 -0.202480
|
||||
vn -0.767469 0.608270 -0.202480
|
||||
vn -0.767469 0.608270 -0.202480
|
||||
vn -0.637310 0.683446 0.356002
|
||||
vn -0.637310 0.683446 0.356002
|
||||
vn -0.637310 0.683446 0.356002
|
||||
vn -0.637310 0.683446 0.356002
|
||||
vn -0.083164 0.094007 0.992092
|
||||
vn -0.083165 0.094007 0.992092
|
||||
vn -0.083164 0.094007 0.992092
|
||||
vn -0.083164 0.094007 0.992092
|
||||
vn 0.241148 -0.090210 0.966287
|
||||
vn 0.241148 -0.090210 0.966287
|
||||
vn 0.241148 -0.090210 0.966287
|
||||
vn 0.241148 -0.090210 0.966287
|
||||
vn 0.867308 -0.359636 0.344149
|
||||
vn 0.867308 -0.359636 0.344149
|
||||
vn 0.867308 -0.359636 0.344149
|
||||
vn 0.867308 -0.359636 0.344149
|
||||
vn 0.827918 -0.310292 -0.467194
|
||||
vn 0.827918 -0.310292 -0.467194
|
||||
vn 0.827918 -0.310292 -0.467195
|
||||
vn 0.827918 -0.310292 -0.467194
|
||||
vn 0.282260 0.010754 -0.959278
|
||||
vn 0.282260 0.010754 -0.959278
|
||||
vn 0.282260 0.010754 -0.959278
|
||||
vn 0.282260 0.010754 -0.959278
|
||||
vn 0.007899 0.161210 -0.986889
|
||||
vn 0.007899 0.161210 -0.986889
|
||||
vn 0.007899 0.161210 -0.986889
|
||||
vn 0.007899 0.161210 -0.986889
|
||||
vn -0.544997 0.360368 0.757042
|
||||
vn -0.544997 0.360368 0.757042
|
||||
vn -0.544997 0.360368 0.757042
|
||||
vn -0.544997 0.360368 0.757042
|
||||
vn -0.077052 0.090534 0.992908
|
||||
vn -0.077052 0.090534 0.992908
|
||||
vn -0.077052 0.090534 0.992908
|
||||
vn -0.077052 0.090534 0.992908
|
||||
vn 0.248662 -0.093840 0.964034
|
||||
vn 0.248662 -0.093840 0.964034
|
||||
vn 0.248662 -0.093840 0.964034
|
||||
vn 0.248662 -0.093840 0.964034
|
||||
vn 0.868208 -0.359881 0.341614
|
||||
vn 0.868208 -0.359881 0.341614
|
||||
vn 0.868208 -0.359881 0.341614
|
||||
vn 0.868208 -0.359881 0.341614
|
||||
vn 0.820167 -0.305191 -0.483927
|
||||
vn 0.820167 -0.305191 -0.483927
|
||||
vn 0.820167 -0.305191 -0.483927
|
||||
vn 0.820167 -0.305191 -0.483927
|
||||
vn -0.901649 0.290351 -0.320509
|
||||
vn -0.901649 0.290351 -0.320509
|
||||
vn -0.901649 0.290351 -0.320509
|
||||
vn -0.901649 0.290351 -0.320509
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn -0.153020 0.117402 0.981225
|
||||
vn 0.944190 -0.256454 0.206730
|
||||
vn 0.944190 -0.256454 0.206730
|
||||
vn 0.944190 -0.256454 0.206730
|
||||
vn 0.944190 -0.256454 0.206730
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn 0.599743 -0.413652 -0.684982
|
||||
vn -0.927462 0.211125 -0.308612
|
||||
vn -0.927462 0.211125 -0.308612
|
||||
vn -0.927462 0.211125 -0.308612
|
||||
vn -0.927462 0.211125 -0.308612
|
||||
vn -0.927462 0.211125 -0.308612
|
||||
vn 0.198298 -0.054623 0.978619
|
||||
vn 0.198298 -0.054623 0.978619
|
||||
vn 0.198298 -0.054623 0.978619
|
||||
vn -0.705068 0.652977 -0.276586
|
||||
vn -0.705068 0.652977 -0.276587
|
||||
vn -0.705068 0.652977 -0.276587
|
||||
vn -0.705068 0.652977 -0.276586
|
||||
vn 0.825979 -0.554652 -0.100597
|
||||
vn 0.825979 -0.554652 -0.100597
|
||||
vn 0.825979 -0.554652 -0.100597
|
||||
vn 0.825979 -0.554652 -0.100597
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291804 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291804 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn -0.329672 0.291803 -0.897868
|
||||
vn 0.954339 0.279212 0.106194
|
||||
vn 0.954339 0.279212 0.106194
|
||||
vn 0.954339 0.279212 0.106194
|
||||
vn 0.954339 0.279212 0.106194
|
||||
vn 0.033520 0.999426 0.005000
|
||||
vn 0.033520 0.999426 0.005000
|
||||
vn 0.033520 0.999426 0.005000
|
||||
vn -0.805391 0.501883 0.315372
|
||||
vn -0.805390 0.501883 0.315372
|
||||
vn -0.805390 0.501883 0.315372
|
||||
vn -0.805390 0.501883 0.315372
|
||||
vn -0.805390 0.501883 0.315372
|
||||
vn 0.049970 0.151179 -0.987243
|
||||
vn 0.049970 0.151179 -0.987243
|
||||
vn 0.049970 0.151179 -0.987243
|
||||
vn 0.049970 0.151179 -0.987243
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn -0.412111 0.909837 0.048596
|
||||
vn -0.412111 0.909837 0.048596
|
||||
vn -0.412111 0.909837 0.048596
|
||||
vn -0.412111 0.909837 0.048596
|
||||
vn 0.130679 0.969156 0.208951
|
||||
vn 0.130679 0.969156 0.208951
|
||||
vn 0.130679 0.969156 0.208951
|
||||
vn 0.130679 0.969156 0.208951
|
||||
vn 0.898657 -0.437843 0.026635
|
||||
vn 0.898657 -0.437843 0.026635
|
||||
vn 0.898657 -0.437843 0.026635
|
||||
vn 0.898657 -0.437843 0.026635
|
||||
vn -0.559499 0.786314 0.262050
|
||||
vn -0.559500 0.786314 0.262050
|
||||
vn 0.901532 -0.413238 -0.128352
|
||||
vn 0.901532 -0.413238 -0.128352
|
||||
vn 0.391848 0.919311 -0.036369
|
||||
vn 0.391848 0.919311 -0.036369
|
||||
vn 0.391848 0.919311 -0.036369
|
||||
vn 0.391848 0.919311 -0.036369
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
s off
|
||||
g Rock14:group1 Rock14:pasted__group Rock14:pasted__pasted__pSphere1 Rock14:pasted__pasted__pSphere1SmoothProxyGroup Rock14:polySurface1
|
||||
usemtl Rock14:lambert6SG
|
||||
f 1/42/1 2/46/2 12/47/3 11/43/4
|
||||
f 2/117/5 3/118/6 13/119/7 12/120/8
|
||||
f 3/9/9 4/1/10 14/4/11 13/10/12
|
||||
f 4/1/13 5/2/14 15/3/15 14/4/16
|
||||
f 5/2/17 6/5/18 16/6/19 15/3/20
|
||||
f 6/5/21 7/11/22 17/12/23 16/6/24
|
||||
f 7/121/25 8/122/26 18/123/27 17/124/28
|
||||
f 8/122/29 9/125/30 19/126/31 18/123/32
|
||||
f 9/38/33 10/39/34 20/40/35 19/41/36
|
||||
f 10/39/37 1/42/38 11/43/39 20/40/40
|
||||
f 11/147/41 12/148/42 22/149/43 21/150/44
|
||||
f 12/96/45 13/92/46 23/95/47 22/97/48
|
||||
f 13/92/49 14/93/50 24/94/51 23/95/52
|
||||
f 14/4/53 15/3/54 25/7/55 24/8/56
|
||||
f 15/3/57 16/6/58 26/13/59 25/7/60
|
||||
f 16/132/61 17/124/62 27/128/63 26/133/64
|
||||
f 17/124/65 18/123/66 28/127/67 27/128/68
|
||||
f 18/123/69 19/126/70 29/129/71 28/127/72
|
||||
f 19/41/73 20/40/74 30/44/75 29/45/76
|
||||
f 20/40/77 11/43/78 21/48/79 30/44/80
|
||||
f 51/165/81 52/164/82 32/166/83 31/167/84
|
||||
f 52/164/85 53/159/86 33/168/87 32/166/88
|
||||
f 54/68/89 55/69/90 35/65/91 34/64/92
|
||||
f 55/17/93 56/20/94 36/27/95 35/28/96
|
||||
f 56/20/97 57/26/98 37/31/99 36/27/100
|
||||
f 57/139/101 58/138/102 38/141/103 37/142/104
|
||||
f 58/138/105 59/140/106 39/143/107 38/141/108
|
||||
f 59/56/109 60/55/110 40/58/111 39/59/112
|
||||
f 60/55/113 51/57/114 31/60/115 40/58/116
|
||||
f 31/167/117 32/166/118 42/169/119 41/170/120
|
||||
f 32/166/121 33/168/122 43/171/123 42/169/124
|
||||
f 33/70/125 34/64/126 44/67/127 43/71/128
|
||||
f 34/64/129 35/65/130 45/66/131 44/67/132
|
||||
f 35/28/133 36/27/134 46/32/135 45/33/136
|
||||
f 92/173/137 93/174/138 94/175/139 95/176/140
|
||||
f 37/142/141 38/141/142 48/144/143 47/145/144
|
||||
f 38/141/145 39/143/146 49/146/147 48/144/148
|
||||
f 39/59/149 40/58/150 50/61/151 49/62/152
|
||||
f 40/58/153 31/60/154 41/63/155 50/61/156
|
||||
f 34/64/157 33/70/158 53/72/159 54/68/160
|
||||
f 47/36/161 44/37/162 45/33/163 46/32/164
|
||||
f 61/156/165 62/155/166 52/164/167 51/165/168
|
||||
f 62/155/169 63/160/170 53/159/171 52/164/172
|
||||
f 55/17/173 25/7/174 26/13/175 73/18/176 64/19/177 56/20/178
|
||||
f 64/19/179 65/25/180 57/26/181 56/20/182
|
||||
f 65/136/183 66/135/184 58/138/185 57/139/186
|
||||
f 66/135/187 67/137/188 59/140/189 58/138/190
|
||||
f 67/53/191 68/52/192 60/55/193 59/56/194
|
||||
f 68/52/195 61/54/196 51/57/197 60/55/198
|
||||
f 69/152/199 70/151/200 62/155/201 61/156/202
|
||||
f 70/151/203 71/154/204 63/160/205 62/155/206
|
||||
f 87/30/207 88/29/208 84/34/209 85/35/210
|
||||
f 73/18/211 74/24/212 65/25/213 64/19/214
|
||||
f 74/131/215 75/130/216 66/135/217 65/136/218
|
||||
f 75/130/219 76/134/220 67/137/221 66/135/222
|
||||
f 76/50/223 77/49/224 68/52/225 67/53/226
|
||||
f 77/49/227 69/51/228 61/54/229 68/52/230
|
||||
f 21/150/231 22/149/232 70/151/233 69/152/234
|
||||
f 22/149/235 23/153/236 71/154/237 70/151/238
|
||||
f 26/13/239 27/23/240 74/24/241 73/18/242
|
||||
f 27/128/243 28/127/244 75/130/245 74/131/246
|
||||
f 28/127/247 29/129/248 76/134/249 75/130/250
|
||||
f 29/45/251 30/44/252 77/49/253 76/50/254
|
||||
f 30/44/255 21/48/256 69/51/257 77/49/258
|
||||
f 78/15/259 79/14/260 83/21/261 82/22/262
|
||||
f 79/177/263 86/178/264 80/179/265 89/180/266 84/181/267 88/182/268 83/183/269
|
||||
f 89/73/270 90/74/271 85/75/272 84/76/273
|
||||
f 81/78/274 78/79/275 82/80/276 87/81/277 85/75/278 90/74/279
|
||||
f 25/7/280 79/14/281 78/15/282 72/16/283 24/8/284
|
||||
f 25/184/285 86/178/286 79/177/287
|
||||
f 82/22/288 83/21/289 88/29/290 87/30/291
|
||||
f 89/73/292 91/77/293 81/78/294 90/74/295
|
||||
f 81/157/296 54/158/297 53/159/298 63/160/299 71/154/300 23/153/301 24/161/302 72/162/303 78/163/304
|
||||
f 91/77/305 55/82/306 54/83/307 81/78/308
|
||||
f 80/98/309 91/99/310 89/100/311
|
||||
f 86/189/312 25/190/313 55/191/314 91/192/315 80/193/316
|
||||
f 42/169/317 43/171/318 44/172/319 41/170/320
|
||||
f 41/101/321 48/102/322 49/103/323 50/104/324
|
||||
f 41/101/325 44/105/326 47/106/327 48/102/328
|
||||
f 36/185/329 37/186/330 93/187/331 92/188/332
|
||||
f 37/84/333 47/85/334 94/86/335 93/87/336
|
||||
f 47/194/337 46/195/338 95/196/339 94/197/340
|
||||
f 46/88/341 36/89/342 92/90/343 95/91/344
|
||||
f 4/107/345 3/108/346 2/109/347 1/110/348 10/111/349 9/112/350 8/113/351 7/114/352 6/115/353 5/116/354
|
||||
@@ -1,366 +0,0 @@
|
||||
# This file uses centimeters as units for non-parametric coordinates.
|
||||
|
||||
mtllib Rock2.mtl
|
||||
g default
|
||||
v 25.186993 -0.000000 22.022926
|
||||
v 23.235949 -0.000000 20.605410
|
||||
v 21.291489 -0.000000 20.612736
|
||||
v 18.902213 -0.000000 22.030251
|
||||
v 17.689819 -0.000000 24.316515
|
||||
v 18.093956 -0.000000 26.764991
|
||||
v 20.044999 -0.000000 28.592473
|
||||
v 22.715751 -0.000000 27.063498
|
||||
v 25.289833 -0.000000 26.712429
|
||||
v 26.035066 -0.000000 24.418840
|
||||
v 25.032486 1.111030 22.135182
|
||||
v 23.176933 1.111030 20.787045
|
||||
v 21.350506 1.111030 20.794371
|
||||
v 19.056721 1.111030 22.142508
|
||||
v 17.880801 1.111030 24.316515
|
||||
v 18.248463 1.111030 26.652734
|
||||
v 20.104015 1.111030 28.410839
|
||||
v 22.656735 1.111030 26.881863
|
||||
v 25.578291 1.111030 26.600172
|
||||
v 26.287049 1.111030 24.418840
|
||||
v 24.584087 2.113304 22.460962
|
||||
v 23.005660 2.113304 21.314168
|
||||
v 20.945110 2.200351 21.265721
|
||||
v 19.028022 2.604830 22.538582
|
||||
v 18.873284 2.113304 24.316515
|
||||
v 19.737993 2.113304 26.785627
|
||||
v 21.316420 2.113304 27.932422
|
||||
v 22.844409 2.113304 26.778144
|
||||
v 25.376599 2.267616 26.166443
|
||||
v 25.971461 2.267616 24.292217
|
||||
v 23.885690 3.148004 22.968377
|
||||
v 22.738896 3.148004 22.135182
|
||||
v 20.991676 3.235050 21.915197
|
||||
v 19.361393 3.638554 22.738175
|
||||
v 19.275273 3.148004 24.116913
|
||||
v 19.975113 3.016991 26.078610
|
||||
v 21.583184 2.941843 27.111407
|
||||
v 22.680041 3.148004 26.194863
|
||||
v 24.237660 3.193425 25.664652
|
||||
v 24.675697 3.173016 24.316515
|
||||
v 23.005660 4.105024 23.607758
|
||||
v 22.402754 4.578174 23.169721
|
||||
v 21.196246 4.105024 22.970118
|
||||
v 20.593340 4.105024 23.408154
|
||||
v 20.363051 4.578174 24.116913
|
||||
v 20.593340 4.105024 24.825671
|
||||
v 21.657523 4.105024 25.463310
|
||||
v 21.972662 4.578174 25.096040
|
||||
v 23.005660 4.105024 25.025273
|
||||
v 23.235949 4.105024 24.316515
|
||||
v 22.402754 4.578174 24.316515
|
||||
v 21.382902 4.578174 23.643317
|
||||
vt 0.000000 0.500000
|
||||
vt 0.100000 0.500000
|
||||
vt 0.200000 0.500000
|
||||
vt 0.300000 0.500000
|
||||
vt 0.400000 0.500000
|
||||
vt 0.500000 0.500000
|
||||
vt 0.600000 0.500000
|
||||
vt 0.700000 0.500000
|
||||
vt 0.800000 0.500000
|
||||
vt 0.900000 0.500000
|
||||
vt 1.000000 0.500000
|
||||
vt 0.000000 0.600000
|
||||
vt 0.100000 0.600000
|
||||
vt 0.200000 0.600000
|
||||
vt 0.300000 0.600000
|
||||
vt 0.400000 0.600000
|
||||
vt 0.500000 0.600000
|
||||
vt 0.600000 0.600000
|
||||
vt 0.700000 0.600000
|
||||
vt 0.800000 0.600000
|
||||
vt 0.900000 0.600000
|
||||
vt 1.000000 0.600000
|
||||
vt 0.000000 0.700000
|
||||
vt 0.100000 0.700000
|
||||
vt 0.200000 0.700000
|
||||
vt 0.300000 0.700000
|
||||
vt 0.400000 0.700000
|
||||
vt 0.500000 0.700000
|
||||
vt 0.600000 0.700000
|
||||
vt 0.700000 0.700000
|
||||
vt 0.800000 0.700000
|
||||
vt 0.900000 0.700000
|
||||
vt 1.000000 0.700000
|
||||
vt 0.000000 0.800000
|
||||
vt 0.100000 0.800000
|
||||
vt 0.200000 0.800000
|
||||
vt 0.300000 0.800000
|
||||
vt 0.400000 0.800000
|
||||
vt 0.500000 0.800000
|
||||
vt 0.600000 0.800000
|
||||
vt 0.700000 0.800000
|
||||
vt 0.800000 0.800000
|
||||
vt 0.900000 0.800000
|
||||
vt 1.000000 0.800000
|
||||
vt 0.000000 0.900000
|
||||
vt 0.100000 0.900000
|
||||
vt 0.200000 0.900000
|
||||
vt 0.300000 0.900000
|
||||
vt 0.400000 0.900000
|
||||
vt 0.500000 0.900000
|
||||
vt 0.600000 0.900000
|
||||
vt 0.700000 0.900000
|
||||
vt 0.800000 0.900000
|
||||
vt 0.900000 0.900000
|
||||
vt 1.000000 0.900000
|
||||
vt 0.400000 0.900000
|
||||
vt 0.250000 0.900000
|
||||
vn 0.580084 0.161342 -0.798418
|
||||
vn 0.580084 0.161342 -0.798418
|
||||
vn 0.580084 0.161342 -0.798418
|
||||
vn 0.580084 0.161342 -0.798418
|
||||
vn -0.003834 0.161340 -0.986891
|
||||
vn -0.003834 0.161340 -0.986891
|
||||
vn -0.003834 0.161340 -0.986891
|
||||
vn -0.003834 0.161340 -0.986891
|
||||
vn -0.501906 0.160635 -0.849875
|
||||
vn -0.501906 0.160635 -0.849875
|
||||
vn -0.501906 0.160635 -0.849875
|
||||
vn -0.501906 0.160635 -0.849875
|
||||
vn -0.870375 0.158872 -0.466054
|
||||
vn -0.870375 0.158872 -0.466054
|
||||
vn -0.870375 0.158872 -0.466054
|
||||
vn -0.870375 0.158872 -0.466054
|
||||
vn -0.974604 0.159475 0.157209
|
||||
vn -0.974604 0.159475 0.157209
|
||||
vn -0.974604 0.159475 0.157209
|
||||
vn -0.974604 0.159475 0.157209
|
||||
vn -0.676819 0.160071 0.718536
|
||||
vn -0.676819 0.160071 0.718536
|
||||
vn -0.676819 0.160071 0.718536
|
||||
vn -0.676819 0.160071 0.718536
|
||||
vn 0.500263 0.139701 0.854530
|
||||
vn 0.500263 0.139701 0.854530
|
||||
vn 0.500263 0.139701 0.854530
|
||||
vn 0.500263 0.139701 0.854530
|
||||
vn 0.113574 0.118736 0.986409
|
||||
vn 0.113574 0.118736 0.986409
|
||||
vn 0.113574 0.118736 0.986409
|
||||
vn 0.113574 0.118736 0.986409
|
||||
vn 0.929675 -0.210853 0.302070
|
||||
vn 0.929675 -0.210853 0.302070
|
||||
vn 0.929675 -0.210853 0.302070
|
||||
vn 0.929675 -0.210853 0.302070
|
||||
vn 0.911983 -0.019305 -0.409774
|
||||
vn 0.911983 -0.019305 -0.409774
|
||||
vn 0.911983 -0.019305 -0.409774
|
||||
vn 0.911983 -0.019305 -0.409774
|
||||
vn 0.520225 0.465477 -0.716029
|
||||
vn 0.520225 0.465477 -0.716029
|
||||
vn 0.520225 0.465477 -0.716029
|
||||
vn 0.520225 0.465477 -0.716029
|
||||
vn 0.019266 0.435045 -0.900203
|
||||
vn 0.019266 0.435045 -0.900203
|
||||
vn 0.019266 0.435045 -0.900203
|
||||
vn 0.019266 0.435045 -0.900203
|
||||
vn -0.504272 0.197549 -0.840645
|
||||
vn -0.504272 0.197549 -0.840645
|
||||
vn -0.504272 0.197549 -0.840645
|
||||
vn -0.504272 0.197549 -0.840645
|
||||
vn -0.888777 0.383100 -0.251612
|
||||
vn -0.888777 0.383100 -0.251612
|
||||
vn -0.888777 0.383100 -0.251612
|
||||
vn -0.888777 0.383100 -0.251612
|
||||
vn -0.625358 0.763679 0.160379
|
||||
vn -0.625358 0.763679 0.160379
|
||||
vn -0.625358 0.763679 0.160379
|
||||
vn -0.625358 0.763679 0.160379
|
||||
vn -0.456193 0.707859 0.539281
|
||||
vn -0.456193 0.707859 0.539281
|
||||
vn -0.456193 0.707859 0.539281
|
||||
vn -0.456193 0.707859 0.539281
|
||||
vn 0.544025 -0.139704 0.827357
|
||||
vn 0.544025 -0.139704 0.827357
|
||||
vn 0.544025 -0.139704 0.827357
|
||||
vn 0.544025 -0.139704 0.827357
|
||||
vn 0.150333 0.239751 0.959124
|
||||
vn 0.150333 0.239751 0.959124
|
||||
vn 0.150333 0.239751 0.959124
|
||||
vn 0.150333 0.239751 0.959124
|
||||
vn 0.915077 0.275889 0.294143
|
||||
vn 0.915077 0.275889 0.294143
|
||||
vn 0.915077 0.275889 0.294143
|
||||
vn 0.915077 0.275889 0.294143
|
||||
vn 0.789517 0.327292 -0.519175
|
||||
vn 0.789517 0.327292 -0.519175
|
||||
vn 0.789517 0.327292 -0.519175
|
||||
vn 0.789517 0.327292 -0.519175
|
||||
vn 0.460444 0.621576 -0.633747
|
||||
vn 0.460444 0.621576 -0.633747
|
||||
vn 0.460444 0.621576 -0.633747
|
||||
vn 0.460444 0.621576 -0.633747
|
||||
vn 0.083626 0.583109 -0.808078
|
||||
vn 0.083626 0.583109 -0.808078
|
||||
vn 0.083626 0.583109 -0.808078
|
||||
vn 0.083626 0.583109 -0.808078
|
||||
vn -0.941734 0.334803 0.032305
|
||||
vn -0.941734 0.334803 0.032305
|
||||
vn -0.941734 0.334803 0.032305
|
||||
vn -0.941734 0.334803 0.032305
|
||||
vn -0.849046 0.426058 0.312402
|
||||
vn -0.849046 0.426058 0.312402
|
||||
vn -0.849046 0.426058 0.312402
|
||||
vn -0.849046 0.426058 0.312402
|
||||
vn -0.409545 0.667599 0.621760
|
||||
vn -0.409545 0.667599 0.621760
|
||||
vn -0.409545 0.667599 0.621760
|
||||
vn -0.409545 0.667599 0.621760
|
||||
vn 0.512367 0.498741 0.699098
|
||||
vn 0.512367 0.498741 0.699098
|
||||
vn 0.512367 0.498741 0.699098
|
||||
vn 0.512367 0.498741 0.699098
|
||||
vn 0.194804 0.570921 0.797559
|
||||
vn 0.194804 0.570921 0.797559
|
||||
vn 0.194804 0.570921 0.797559
|
||||
vn 0.194804 0.570921 0.797559
|
||||
vn 0.569111 0.802909 0.177338
|
||||
vn 0.569111 0.802909 0.177338
|
||||
vn 0.569111 0.802909 0.177338
|
||||
vn 0.569111 0.802909 0.177338
|
||||
vn 0.568551 0.701957 -0.428959
|
||||
vn 0.568551 0.701957 -0.428959
|
||||
vn 0.568551 0.701957 -0.428959
|
||||
vn 0.568551 0.701957 -0.428959
|
||||
vn 0.554426 0.648341 -0.521791
|
||||
vn 0.554426 0.648341 -0.521791
|
||||
vn 0.554427 0.648341 -0.521791
|
||||
vn 0.554427 0.648341 -0.521791
|
||||
vn 0.017111 0.672832 -0.739597
|
||||
vn 0.017111 0.672832 -0.739597
|
||||
vn 0.017111 0.672832 -0.739597
|
||||
vn 0.017111 0.672832 -0.739597
|
||||
vn -0.146247 0.837249 -0.526902
|
||||
vn -0.146247 0.837249 -0.526902
|
||||
vn -0.146247 0.837249 -0.526902
|
||||
vn -0.146247 0.837249 -0.526902
|
||||
vn -0.615451 0.783386 -0.086756
|
||||
vn -0.615451 0.783386 -0.086756
|
||||
vn -0.615451 0.783386 -0.086756
|
||||
vn -0.615451 0.783386 -0.086756
|
||||
vn -0.668374 0.640759 0.377762
|
||||
vn -0.668374 0.640759 0.377762
|
||||
vn -0.668374 0.640759 0.377762
|
||||
vn -0.668374 0.640759 0.377762
|
||||
vn -0.312212 0.785196 0.534781
|
||||
vn -0.312212 0.785196 0.534780
|
||||
vn -0.312212 0.785196 0.534781
|
||||
vn -0.312212 0.785196 0.534781
|
||||
vn 0.228837 0.733621 0.639870
|
||||
vn 0.228837 0.733621 0.639870
|
||||
vn 0.228837 0.733621 0.639870
|
||||
vn 0.228837 0.733621 0.639870
|
||||
vn 0.268465 0.707542 0.653690
|
||||
vn 0.268465 0.707542 0.653690
|
||||
vn 0.268465 0.707542 0.653690
|
||||
vn 0.268465 0.707542 0.653690
|
||||
vn 0.533113 0.829801 0.164985
|
||||
vn 0.533113 0.829801 0.164985
|
||||
vn 0.533113 0.829801 0.164985
|
||||
vn 0.533113 0.829802 0.164985
|
||||
vn 0.556588 0.780164 -0.285575
|
||||
vn 0.556588 0.780164 -0.285575
|
||||
vn 0.556588 0.780164 -0.285575
|
||||
vn 0.556589 0.780164 -0.285575
|
||||
vn -0.392903 0.410045 -0.823098
|
||||
vn -0.392903 0.410045 -0.823098
|
||||
vn -0.392903 0.410045 -0.823098
|
||||
vn -0.392903 0.410045 -0.823098
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.000000 -1.000000 0.000000
|
||||
vn 0.449182 0.870925 0.199311
|
||||
vn 0.449182 0.870925 0.199311
|
||||
vn 0.449182 0.870925 0.199311
|
||||
vn 0.449182 0.870925 0.199311
|
||||
vn -0.238380 0.824416 -0.513335
|
||||
vn -0.238380 0.824416 -0.513335
|
||||
vn -0.238380 0.824416 -0.513335
|
||||
vn -0.362342 0.713878 0.599239
|
||||
vn -0.362342 0.713878 0.599239
|
||||
vn -0.362342 0.713878 0.599239
|
||||
vn -0.362342 0.713878 0.599239
|
||||
vn 0.563665 0.823036 -0.069956
|
||||
vn 0.563665 0.823036 -0.069956
|
||||
vn 0.563665 0.823036 -0.069956
|
||||
vn 0.563665 0.823036 -0.069956
|
||||
vn -0.275874 0.755625 -0.594074
|
||||
vn -0.275874 0.755625 -0.594074
|
||||
vn -0.275874 0.755625 -0.594074
|
||||
vn -0.344415 0.810345 -0.474046
|
||||
vn -0.344415 0.810345 -0.474046
|
||||
vn -0.344415 0.810345 -0.474046
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
vn 0.000000 1.000000 0.000000
|
||||
s off
|
||||
g pasted__pasted__pSphere3 pasted__pasted__pSphere1SmoothProxyGroup pasted__group group2
|
||||
usemtl pasted__pasted__lambert3SG1
|
||||
f 1/1/1 2/2/2 12/13/3 11/12/4
|
||||
f 2/2/5 3/3/6 13/14/7 12/13/8
|
||||
f 3/3/9 4/4/10 14/15/11 13/14/12
|
||||
f 4/4/13 5/5/14 15/16/15 14/15/16
|
||||
f 5/5/17 6/6/18 16/17/19 15/16/20
|
||||
f 6/6/21 7/7/22 17/18/23 16/17/24
|
||||
f 7/7/25 8/8/26 18/19/27 17/18/28
|
||||
f 8/8/29 9/9/30 19/20/31 18/19/32
|
||||
f 9/9/33 10/10/34 20/21/35 19/20/36
|
||||
f 10/10/37 1/11/38 11/22/39 20/21/40
|
||||
f 11/12/41 12/13/42 22/24/43 21/23/44
|
||||
f 12/13/45 13/14/46 23/25/47 22/24/48
|
||||
f 13/14/49 14/15/50 24/26/51 23/25/52
|
||||
f 14/15/53 15/16/54 25/27/55 24/26/56
|
||||
f 15/16/57 16/17/58 26/28/59 25/27/60
|
||||
f 16/17/61 17/18/62 27/29/63 26/28/64
|
||||
f 17/18/65 18/19/66 28/30/67 27/29/68
|
||||
f 18/19/69 19/20/70 29/31/71 28/30/72
|
||||
f 19/20/73 20/21/74 30/32/75 29/31/76
|
||||
f 20/21/77 11/22/78 21/33/79 30/32/80
|
||||
f 21/23/81 22/24/82 32/35/83 31/34/84
|
||||
f 22/24/85 23/25/86 33/36/87 32/35/88
|
||||
f 24/26/89 25/27/90 35/38/91 34/37/92
|
||||
f 25/27/93 26/28/94 36/39/95 35/38/96
|
||||
f 26/28/97 27/29/98 37/40/99 36/39/100
|
||||
f 27/29/101 28/30/102 38/41/103 37/40/104
|
||||
f 28/30/105 29/31/106 39/42/107 38/41/108
|
||||
f 29/31/109 30/32/110 40/43/111 39/42/112
|
||||
f 30/32/113 21/33/114 31/44/115 40/43/116
|
||||
f 31/34/117 32/35/118 42/46/119 41/45/120
|
||||
f 32/35/121 33/36/122 43/47/123 42/46/124
|
||||
f 33/36/125 34/37/126 44/48/127 43/47/128
|
||||
f 34/37/129 35/38/130 45/49/131 44/48/132
|
||||
f 35/38/133 36/39/134 46/50/135 45/49/136
|
||||
f 36/39/137 37/40/138 47/51/139 46/50/140
|
||||
f 37/40/141 38/41/142 48/52/143 47/51/144
|
||||
f 38/41/145 39/42/146 49/53/147 48/52/148
|
||||
f 39/42/149 40/43/150 50/54/151 49/53/152
|
||||
f 40/43/153 31/44/154 41/55/155 50/54/156
|
||||
f 34/37/157 33/36/158 23/25/159 24/26/160
|
||||
f 42/46/161 52/57/162 51/56/163
|
||||
f 5/5/164 4/4/165 3/3/166 2/2/167 1/11/168 10/10/169 9/9/170 8/8/171 7/7/172 6/6/173
|
||||
f 50/54/174 51/56/175 48/52/176 49/53/177
|
||||
f 42/46/178 43/47/179 52/57/180
|
||||
f 48/52/181 45/49/182 46/50/183 47/51/184
|
||||
f 42/46/185 51/56/186 50/54/187 41/45/188
|
||||
f 52/57/189 44/48/190 45/49/191
|
||||
f 52/57/192 43/47/193 44/48/194
|
||||
f 48/52/195 52/57/196 45/49/197
|
||||
f 51/56/198 52/57/199 48/52/200
|
||||
@@ -1,335 +0,0 @@
|
||||
# This file uses centimeters as units for non-parametric coordinates.
|
||||
|
||||
mtllib Rock3.mtl
|
||||
g default
|
||||
v 13.833709 0.000000 20.545640
|
||||
v 10.895352 0.067342 20.071071
|
||||
v 8.423192 0.011054 19.337600
|
||||
v 6.033916 0.000000 20.768441
|
||||
v 5.288684 0.000000 23.926150
|
||||
v 5.692821 0.000000 26.374625
|
||||
v 7.643864 0.000000 28.202107
|
||||
v 10.834814 0.000000 28.047221
|
||||
v 13.424298 0.000000 27.316141
|
||||
v 15.143125 0.000000 24.012658
|
||||
v 13.679201 1.150071 20.610833
|
||||
v 10.813328 1.551362 19.926895
|
||||
v 8.482208 1.318615 19.300655
|
||||
v 6.188423 1.120731 20.869002
|
||||
v 5.479666 1.332809 23.926150
|
||||
v 5.847328 1.332809 26.262369
|
||||
v 7.702880 1.111030 28.020473
|
||||
v 10.775798 1.111030 27.865586
|
||||
v 13.750559 1.111030 27.164673
|
||||
v 15.395108 1.111030 24.012658
|
||||
v 12.848128 2.591355 21.221606
|
||||
v 10.604525 3.538122 20.275184
|
||||
v 8.653481 3.318093 20.275184
|
||||
v 7.075054 2.518015 21.824256
|
||||
v 6.874138 2.940163 23.717881
|
||||
v 7.573977 2.908714 25.688245
|
||||
v 8.915285 2.113304 27.542056
|
||||
v 10.604525 2.113304 26.928497
|
||||
v 13.251090 2.644528 25.498312
|
||||
v 13.905365 2.782922 23.589474
|
||||
v 11.561858 5.301655 22.160232
|
||||
v 10.337761 4.912658 21.096198
|
||||
v 8.458968 4.369444 20.896596
|
||||
v 7.312174 3.581077 22.040814
|
||||
v 9.182049 2.908714 26.721042
|
||||
v 10.337761 3.004681 26.107482
|
||||
v 11.836525 3.970716 25.274288
|
||||
v 12.274561 4.808196 23.926150
|
||||
v 10.604525 6.143015 22.936974
|
||||
v 10.001619 6.065552 22.367323
|
||||
v 8.795110 5.082905 22.167721
|
||||
v 8.192205 4.518381 22.737372
|
||||
v 7.961915 5.332164 23.657443
|
||||
v 7.922168 3.513467 25.185728
|
||||
v 8.986351 3.787577 25.823367
|
||||
v 10.001619 5.762042 25.072944
|
||||
v 10.604525 4.884316 24.634908
|
||||
v 10.834814 5.547103 23.857046
|
||||
vt 0.000000 0.500000
|
||||
vt 0.100000 0.500000
|
||||
vt 0.200000 0.500000
|
||||
vt 0.300000 0.500000
|
||||
vt 0.400000 0.500000
|
||||
vt 0.500000 0.500000
|
||||
vt 0.600000 0.500000
|
||||
vt 0.700000 0.500000
|
||||
vt 0.800000 0.500000
|
||||
vt 0.900000 0.500000
|
||||
vt 1.000000 0.500000
|
||||
vt 0.000000 0.600000
|
||||
vt 0.100000 0.600000
|
||||
vt 0.200000 0.600000
|
||||
vt 0.300000 0.600000
|
||||
vt 0.400000 0.600000
|
||||
vt 0.500000 0.600000
|
||||
vt 0.600000 0.600000
|
||||
vt 0.700000 0.600000
|
||||
vt 0.800000 0.600000
|
||||
vt 0.900000 0.600000
|
||||
vt 1.000000 0.600000
|
||||
vt 0.000000 0.700000
|
||||
vt 0.100000 0.700000
|
||||
vt 0.200000 0.700000
|
||||
vt 0.300000 0.700000
|
||||
vt 0.400000 0.750000
|
||||
vt 0.500000 0.750000
|
||||
vt 0.600000 0.700000
|
||||
vt 0.700000 0.700000
|
||||
vt 0.800000 0.700000
|
||||
vt 0.900000 0.700000
|
||||
vt 1.000000 0.700000
|
||||
vt 0.000000 0.800000
|
||||
vt 0.100000 0.800000
|
||||
vt 0.200000 0.800000
|
||||
vt 0.300000 0.800000
|
||||
vt 0.600000 0.800000
|
||||
vt 0.700000 0.800000
|
||||
vt 0.800000 0.800000
|
||||
vt 0.900000 0.800000
|
||||
vt 1.000000 0.800000
|
||||
vt 0.000000 0.900000
|
||||
vt 0.100000 0.900000
|
||||
vt 0.200000 0.900000
|
||||
vt 0.300000 0.900000
|
||||
vt 0.400000 0.900000
|
||||
vt 0.500000 0.900000
|
||||
vt 0.600000 0.900000
|
||||
vt 0.700000 0.900000
|
||||
vt 0.800000 0.900000
|
||||
vt 0.900000 0.900000
|
||||
vt 1.000000 0.900000
|
||||
vn 0.194797 -0.011916 -0.980771
|
||||
vn 0.194797 -0.011916 -0.980771
|
||||
vn 0.194797 -0.011916 -0.980771
|
||||
vn 0.194797 -0.011916 -0.980771
|
||||
vn 0.275226 -0.059985 -0.959506
|
||||
vn 0.275226 -0.059985 -0.959506
|
||||
vn 0.275226 -0.059985 -0.959506
|
||||
vn 0.275226 -0.059985 -0.959506
|
||||
vn -0.540206 0.069472 -0.838661
|
||||
vn -0.540206 0.069472 -0.838661
|
||||
vn -0.540206 0.069472 -0.838660
|
||||
vn -0.540206 0.069472 -0.838661
|
||||
vn -0.962317 0.144937 -0.230084
|
||||
vn -0.962317 0.144937 -0.230084
|
||||
vn -0.962317 0.144937 -0.230084
|
||||
vn -0.962317 0.144937 -0.230084
|
||||
vn -0.978408 0.133457 0.157823
|
||||
vn -0.978408 0.133457 0.157823
|
||||
vn -0.978408 0.133457 0.157823
|
||||
vn -0.978408 0.133457 0.157823
|
||||
vn -0.673794 0.145980 0.724355
|
||||
vn -0.673794 0.145980 0.724355
|
||||
vn -0.673794 0.145980 0.724355
|
||||
vn -0.673794 0.145980 0.724355
|
||||
vn 0.048748 0.161149 0.985725
|
||||
vn 0.048748 0.161149 0.985725
|
||||
vn 0.048748 0.161149 0.985725
|
||||
vn 0.048748 0.161149 0.985725
|
||||
vn 0.247597 0.114444 0.962080
|
||||
vn 0.247597 0.114444 0.962080
|
||||
vn 0.247597 0.114444 0.962080
|
||||
vn 0.247597 0.114444 0.962080
|
||||
vn 0.869747 -0.195444 0.453146
|
||||
vn 0.869747 -0.195444 0.453146
|
||||
vn 0.869747 -0.195444 0.453146
|
||||
vn 0.869747 -0.195444 0.453146
|
||||
vn 0.914754 -0.027814 -0.403054
|
||||
vn 0.914754 -0.027814 -0.403054
|
||||
vn 0.914754 -0.027814 -0.403054
|
||||
vn 0.914754 -0.027814 -0.403054
|
||||
vn 0.367579 0.352295 -0.860682
|
||||
vn 0.367579 0.352295 -0.860682
|
||||
vn 0.367579 0.352295 -0.860682
|
||||
vn 0.367579 0.352295 -0.860682
|
||||
vn 0.104781 0.314112 -0.943586
|
||||
vn 0.104781 0.314112 -0.943586
|
||||
vn 0.104781 0.314112 -0.943586
|
||||
vn 0.104781 0.314112 -0.943586
|
||||
vn -0.611418 0.526190 -0.591009
|
||||
vn -0.611418 0.526190 -0.591009
|
||||
vn -0.611418 0.526190 -0.591009
|
||||
vn -0.611418 0.526190 -0.591009
|
||||
vn -0.750504 0.623933 -0.217830
|
||||
vn -0.750504 0.623934 -0.217830
|
||||
vn -0.750504 0.623933 -0.217830
|
||||
vn -0.750504 0.623933 -0.217830
|
||||
vn -0.681408 0.710897 0.174096
|
||||
vn -0.681408 0.710897 0.174096
|
||||
vn -0.681408 0.710897 0.174096
|
||||
vn -0.681408 0.710897 0.174096
|
||||
vn -0.417580 0.708358 0.569083
|
||||
vn -0.417580 0.708358 0.569083
|
||||
vn -0.417580 0.708358 0.569083
|
||||
vn -0.417580 0.708358 0.569083
|
||||
vn 0.135733 0.523482 0.841156
|
||||
vn 0.135733 0.523482 0.841156
|
||||
vn 0.135733 0.523482 0.841156
|
||||
vn 0.135733 0.523482 0.841156
|
||||
vn 0.182076 0.727417 0.661598
|
||||
vn 0.182076 0.727417 0.661598
|
||||
vn 0.182076 0.727417 0.661598
|
||||
vn 0.182076 0.727417 0.661598
|
||||
vn 0.689856 0.643864 0.330965
|
||||
vn 0.689856 0.643864 0.330965
|
||||
vn 0.689856 0.643864 0.330965
|
||||
vn 0.689856 0.643864 0.330965
|
||||
vn 0.734654 0.569856 -0.368169
|
||||
vn 0.734654 0.569856 -0.368169
|
||||
vn 0.734654 0.569856 -0.368169
|
||||
vn 0.734654 0.569856 -0.368169
|
||||
vn 0.493929 0.495560 -0.714460
|
||||
vn 0.493929 0.495560 -0.714460
|
||||
vn 0.493929 0.495560 -0.714460
|
||||
vn 0.493929 0.495560 -0.714460
|
||||
vn -0.055181 0.502526 -0.862799
|
||||
vn -0.055181 0.502526 -0.862799
|
||||
vn -0.055181 0.502526 -0.862799
|
||||
vn -0.055181 0.502526 -0.862799
|
||||
vn -0.956799 0.245235 -0.156188
|
||||
vn -0.956799 0.245235 -0.156188
|
||||
vn -0.956799 0.245235 -0.156188
|
||||
vn -0.372740 0.724050 0.580359
|
||||
vn -0.372740 0.724050 0.580359
|
||||
vn -0.372740 0.724050 0.580359
|
||||
vn 0.274567 0.670728 0.689011
|
||||
vn 0.274567 0.670728 0.689011
|
||||
vn 0.274567 0.670728 0.689011
|
||||
vn 0.274567 0.670728 0.689011
|
||||
vn 0.235444 0.554619 0.798100
|
||||
vn 0.235444 0.554619 0.798100
|
||||
vn 0.235444 0.554619 0.798100
|
||||
vn 0.235444 0.554619 0.798100
|
||||
vn 0.681798 0.605743 0.410155
|
||||
vn 0.681798 0.605743 0.410155
|
||||
vn 0.681798 0.605743 0.410155
|
||||
vn 0.681798 0.605743 0.410155
|
||||
vn 0.777186 0.557392 -0.292057
|
||||
vn 0.777186 0.557392 -0.292057
|
||||
vn 0.777186 0.557392 -0.292057
|
||||
vn 0.777186 0.557392 -0.292057
|
||||
vn 0.303374 0.771312 -0.559502
|
||||
vn 0.303374 0.771312 -0.559502
|
||||
vn 0.303374 0.771312 -0.559502
|
||||
vn 0.303374 0.771312 -0.559502
|
||||
vn -0.306581 0.767279 -0.563286
|
||||
vn -0.306581 0.767279 -0.563287
|
||||
vn -0.306581 0.767279 -0.563287
|
||||
vn -0.306581 0.767279 -0.563287
|
||||
vn -0.695994 0.700552 -0.157544
|
||||
vn -0.695994 0.700552 -0.157544
|
||||
vn -0.695994 0.700552 -0.157544
|
||||
vn -0.695994 0.700552 -0.157544
|
||||
vn -0.813570 0.527577 -0.244473
|
||||
vn -0.813570 0.527577 -0.244473
|
||||
vn -0.813570 0.527577 -0.244473
|
||||
vn -0.813570 0.527577 -0.244473
|
||||
vn -0.798753 0.456390 0.392048
|
||||
vn -0.798753 0.456390 0.392048
|
||||
vn -0.798753 0.456390 0.392048
|
||||
vn -0.798753 0.456390 0.392048
|
||||
vn -0.455097 0.635462 0.623759
|
||||
vn -0.455097 0.635462 0.623759
|
||||
vn -0.455097 0.635462 0.623759
|
||||
vn -0.455097 0.635462 0.623759
|
||||
vn 0.093149 0.477794 0.873519
|
||||
vn 0.093149 0.477794 0.873519
|
||||
vn 0.093149 0.477794 0.873519
|
||||
vn 0.093149 0.477794 0.873519
|
||||
vn 0.426084 0.519684 0.740527
|
||||
vn 0.426084 0.519685 0.740527
|
||||
vn 0.426084 0.519685 0.740527
|
||||
vn 0.426084 0.519685 0.740527
|
||||
vn 0.292845 0.735440 0.611040
|
||||
vn 0.292845 0.735440 0.611040
|
||||
vn 0.292845 0.735440 0.611040
|
||||
vn 0.292845 0.735440 0.611040
|
||||
vn 0.571919 0.810287 0.127844
|
||||
vn 0.571919 0.810287 0.127844
|
||||
vn 0.571919 0.810287 0.127844
|
||||
vn 0.571919 0.810287 0.127844
|
||||
vn -0.750908 0.256338 -0.608628
|
||||
vn -0.750908 0.256338 -0.608628
|
||||
vn -0.750908 0.256338 -0.608628
|
||||
vn -0.750908 0.256338 -0.608628
|
||||
vn -0.584539 0.607145 0.538227
|
||||
vn -0.584539 0.607145 0.538227
|
||||
vn -0.584539 0.607145 0.538227
|
||||
vn -0.584539 0.607145 0.538227
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.000551 -0.999995 -0.003129
|
||||
vn 0.809645 0.306279 0.500668
|
||||
vn 0.809645 0.306279 0.500668
|
||||
vn 0.809645 0.306278 0.500668
|
||||
vn -0.546598 0.537686 0.641969
|
||||
vn -0.546598 0.537686 0.641969
|
||||
vn -0.546598 0.537686 0.641969
|
||||
vn -0.546598 0.537686 0.641969
|
||||
vn -0.794478 0.342314 -0.501623
|
||||
vn -0.794478 0.342314 -0.501623
|
||||
vn -0.794478 0.342314 -0.501623
|
||||
vn -0.058940 0.977204 -0.203958
|
||||
vn -0.058940 0.977204 -0.203958
|
||||
vn -0.058940 0.977204 -0.203958
|
||||
vn -0.058940 0.977204 -0.203958
|
||||
s off
|
||||
g pasted__pasted__pSphere2 pasted__pasted__pSphere1SmoothProxyGroup pasted__group group2
|
||||
usemtl pasted__pasted__lambert3SG1
|
||||
f 1/1/1 2/2/2 12/13/3 11/12/4
|
||||
f 2/2/5 3/3/6 13/14/7 12/13/8
|
||||
f 3/3/9 4/4/10 14/15/11 13/14/12
|
||||
f 4/4/13 5/5/14 15/16/15 14/15/16
|
||||
f 5/5/17 6/6/18 16/17/19 15/16/20
|
||||
f 6/6/21 7/7/22 17/18/23 16/17/24
|
||||
f 7/7/25 8/8/26 18/19/27 17/18/28
|
||||
f 8/8/29 9/9/30 19/20/31 18/19/32
|
||||
f 9/9/33 10/10/34 20/21/35 19/20/36
|
||||
f 10/10/37 1/11/38 11/22/39 20/21/40
|
||||
f 11/12/41 12/13/42 22/24/43 21/23/44
|
||||
f 12/13/45 13/14/46 23/25/47 22/24/48
|
||||
f 13/14/49 14/15/50 24/26/51 23/25/52
|
||||
f 14/15/53 15/16/54 25/27/55 24/26/56
|
||||
f 15/16/57 16/17/58 26/28/59 25/27/60
|
||||
f 16/17/61 17/18/62 27/29/63 26/28/64
|
||||
f 17/18/65 18/19/66 28/30/67 27/29/68
|
||||
f 18/19/69 19/20/70 29/31/71 28/30/72
|
||||
f 19/20/73 20/21/74 30/32/75 29/31/76
|
||||
f 20/21/77 11/22/78 21/33/79 30/32/80
|
||||
f 21/23/81 22/24/82 32/35/83 31/34/84
|
||||
f 22/24/85 23/25/86 33/36/87 32/35/88
|
||||
f 24/26/89 25/27/90 34/37/91
|
||||
f 26/28/92 27/29/93 35/38/94
|
||||
f 27/29/95 28/30/96 36/39/97 35/38/98
|
||||
f 28/30/99 29/31/100 37/40/101 36/39/102
|
||||
f 29/31/103 30/32/104 38/41/105 37/40/106
|
||||
f 30/32/107 21/33/108 31/42/109 38/41/110
|
||||
f 31/34/111 32/35/112 40/44/113 39/43/114
|
||||
f 32/35/115 33/36/116 41/45/117 40/44/118
|
||||
f 33/36/119 34/37/120 42/46/121 41/45/122
|
||||
f 34/37/123 25/27/124 43/47/125 42/46/126
|
||||
f 25/27/127 26/28/128 44/48/129 43/47/130
|
||||
f 26/28/131 35/38/132 45/49/133 44/48/134
|
||||
f 35/38/135 36/39/136 46/50/137 45/49/138
|
||||
f 36/39/139 37/40/140 47/51/141 46/50/142
|
||||
f 37/40/143 38/41/144 48/52/145 47/51/146
|
||||
f 38/41/147 31/42/148 39/53/149 48/52/150
|
||||
f 34/37/151 33/36/152 23/25/153 24/26/154
|
||||
f 40/44/155 41/45/156 48/52/157 39/43/158
|
||||
f 5/5/159 4/4/160 3/3/161 2/2/162 1/11/163 10/10/164 9/9/165 8/8/166 7/7/167 6/6/168
|
||||
f 48/52/169 46/50/170 47/51/171
|
||||
f 46/50/172 43/47/173 44/48/174 45/49/175
|
||||
f 43/47/176 41/45/177 42/46/178
|
||||
f 48/52/179 41/45/180 43/47/181 46/50/182
|
||||