Here is my source code without everything unnecessary:
- Code: Select all
#include <SFML/Graphics.hpp>
#include <Newton/Newton.h>
#include <Newton/dMath/dVector.h>
#include <Newton/dMath/dMatrix.cpp>
#include <Newton/dMath/dQuaternion.h>
#include <Newton/dMath/dMathDefines.h>
#include <Newton/JointLibrary.h>
#include <Newton/dCustomJoints/CustomJointLibraryStdAfx.h>
#include <Newton/dCustomJoints/CustomPlayerController.h>
#define PLAYER_SPEED 10.0f
#define PLAYER_SIDE_SPEED 5.0f
#define PLAYER_JOINT_ID 0xEF38AB01
void playerMove(CustomPlayerController *player, dFloat velocity, dFloat strafe, dFloat rotation)
{
velocity *= PLAYER_SPEED;
strafe *= PLAYER_SIDE_SPEED;
player-> SetVelocity(velocity, strafe, rotation);
}
// add force and torque to rigid body
void PhysicsApplyGravityForce (const NewtonBody* body, dFloat timestep, int threadIndex)
{
dFloat Ixx;
dFloat Iyy;
dFloat Izz;
dFloat mass;
NewtonBodyGetMassMatrix (body, &mass, &Ixx, &Iyy, &Izz);
dVector force (0.0f, -mass * 10.0f, 0.0f);
NewtonBodySetForce (body, &force.m_x);
}
NewtonBody* CreatePlayBody (
NewtonWorld* world,
dFloat mass,
const dMatrix& srcMatrix,
const dVector& size,
int matrixlId)
{
dFloat Ixx;
dFloat Iyy;
dFloat Izz;
NewtonBody* rigidBody;
NewtonCollision* collision;
dVector origin;
dVector inertia;
dMatrix matrix (srcMatrix);
matrix.m_front = matrix.m_front.Scale (1.0f / dSqrt (matrix.m_front % matrix.m_front));
matrix.m_right = matrix.m_front * matrix.m_up;
matrix.m_right = matrix.m_right.Scale (1.0f / dSqrt (matrix.m_right % matrix.m_right));
matrix.m_up = matrix.m_right * matrix.m_front;
// create the collision
dMatrix location (dRollMatrix(-3.1416f * 0.5f));
collision = NewtonCreateCapsule (world, size.m_y, size.m_x, 0, &location[0][0]);
// collision = NewtonCreateCylinder (world, size.m_y, size.m_x, 0, &location[0][0]);
// calculate the moment of inertia and the relative center of mass of the solid
NewtonConvexCollisionCalculateInertialMatrix (collision, &inertia[0], &origin[0]);
Ixx = mass * inertia[0];
Iyy = mass * inertia[1];
Izz = mass * inertia[2];
//create the rigid body
rigidBody = NewtonCreateBody (world, collision);
// release the collision geometry when not need it
NewtonReleaseCollision (world, collision);
// set the correct center of gravity for this body
NewtonBodySetCentreOfMass (rigidBody, &origin[0]);
// set the mass matrix
NewtonBodySetMassMatrix (rigidBody, mass, Ixx, Iyy, Izz);
// assign the wood id
NewtonBodySetMaterialGroupID (rigidBody, matrixlId);
// set the force and torque call back function
NewtonBodySetForceAndTorqueCallback (rigidBody, PhysicsApplyGravityForce);
// set the matrix for both the rigid body and the graphic body
NewtonBodySetMatrix (rigidBody, &matrix[0][0]);
return rigidBody;
}
int main()
{
NewtonWorld* g_world;
// Create main window
sf::RenderWindow App(sf::VideoMode(800, 600), "мій курсовий кусень коду");
App.PreserveOpenGLStates(true);
// Enable Z-buffer read and write
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glClearDepth(1.f);
// Setup a perspective projection
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);
// Create a clock for measuring the time elapsed
sf::Clock Clock;
g_world = NewtonCreate();
NewtonSetPlatformArchitecture(g_world, 0);
// set a fix world size
dVector minSize (-500.0f, -500.0f, -500.0f);
dVector maxSize ( 500.0f, 500.0f, 500.0f);
NewtonSetWorldSize (g_world, &minSize[0], &maxSize[0]);
// configure the Newton world to use iterative solve mode 0
// this is the most efficient but the less accurate mode
NewtonSetSolverModel (g_world, 1);
// NEWTON CC
CustomPlayerController* player;
NewtonBody* playerBody;
dMatrix location (GetIdentityMatrix());
location.m_posit.m_y = 0;
dFloat kinematicCushion = 1.0f / 64.0f;
dVector size (1.8748f, 0.4885f, 1.0f);
playerBody = CreatePlayBody(g_world, 100, location, size, 0);
// make sure the player is active
dVector pin (0.0f, 1.0f, 0.0f, 0.0f);
dMatrix globalFrame (GetIdentityMatrix());
globalFrame.m_front = dVector (0.0f, 1.0f, 0.0f, 0.0f); // up direction in global Space
globalFrame.m_up = dVector (1.0f, 0.0f, 0.0f, 0.0f); // front direction in global Space
globalFrame.m_right = globalFrame.m_front * globalFrame.m_up; // strafing direction in global Space
dFloat maxStairStepFactor = 0.7f / size.m_x;
player = new CustomPlayerController(globalFrame, playerBody, maxStairStepFactor, kinematicCushion);
dVector eye, lookat, up;
eye = dVector(0, 250, 40);
lookat = dVector(0, 0, 0);
up = dVector(0, 1, 0);
// Start game loop
while (App.IsOpened())
{
// Process events
sf::Event Event;
NewtonUpdate(g_world, Clock.GetElapsedTime());
while (App.GetEvent(Event))
{
// Close window : exit
if (Event.Type == sf::Event::Closed)
App.Close();
// Escape key : exit
if ((Event.Type == sf::Event::KeyPressed))
switch (Event.Key.Code)
{
case sf::Key::Escape:
App.Close();
break;
}
// Adjust the viewport when the window is resized
if (Event.Type == sf::Event::Resized)
glViewport(0, 0, Event.Size.Width, Event.Size.Height);
}
// Clear depth buffer
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Apply some transformations
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(eye.m_x, eye.m_y, eye.m_z, lookat.m_x, lookat.m_y, lookat.m_z, up.m_x, up.m_y, up.m_z);
// Finally, display the rendered frame on screen
App.Display();
}
// destroy all rigid bodies, this is not necessary because Newton Destroy world will also destroy all bodies
// but if you want to change level and restart you can call this function.
NewtonDestroyAllBodies (g_world);
// finally destroy the newton world
NewtonDestroy (g_world);
return EXIT_SUCCESS;
}
And here is the compiler output:
**** Build of configuration Debug for project myGLApp ****
make all
Building file: ../main.cpp
Invoking: GCC C++ Compiler
g++ -O0 -g3 -Wall -c -fmessage-length=0 -MMD -MP -MF"main.d" -MT"main.d" -o"main.o" "../main.cpp" -I/usr/include/Newton
#SOME WARNINGS FROM SFML HERE
Finished building: ../main.cpp
Building target: myGLApp
Invoking: GCC C++ Linker
g++ -o"myGLApp" ./main.o -lsfml-graphics -lsfml-window -lpthread -lsfml-system -lGL -lGLU /usr/lib/libNewton.a -I/usr/include/Newton
./main.o: In function `main':
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `NewtonCustomJoint::operator new(unsigned int)'
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `CustomPlayerController::CustomPlayerController(dMatrix const&, NewtonBody const*, float, float)'
/home/errorist/workspace/myGLApp/Debug/../main.cpp:145: undefined reference to `NewtonCustomJoint::operator delete(void*)'
collect2: ld returned 1 exit status
make: *** [myGLApp] Error 1
Someone, tell me, please, what should i do to make CC work properly...