Convert basics to C++
This commit is contained in:
parent
86a5055d63
commit
b973003a6b
4 changed files with 172 additions and 222 deletions
|
@ -5,12 +5,7 @@
|
||||||
Import('env')
|
Import('env')
|
||||||
|
|
||||||
files = Split("""
|
files = Split("""
|
||||||
basics.c
|
basics.cpp
|
||||||
camera.c
|
|
||||||
object.c
|
|
||||||
scene.c
|
|
||||||
texture.c
|
|
||||||
writer_png.c
|
|
||||||
""")
|
""")
|
||||||
|
|
||||||
lib = env.Library('charles', files)
|
lib = env.Library('charles', files)
|
||||||
|
|
178
src/basics.c
178
src/basics.c
|
@ -1,178 +0,0 @@
|
||||||
/* basics.c
|
|
||||||
*
|
|
||||||
* Definition of basic types: Vector.
|
|
||||||
*
|
|
||||||
* Eryn Wells <eryn@erynwells.me>
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <math.h>
|
|
||||||
#include "basics.h"
|
|
||||||
|
|
||||||
|
|
||||||
const Vector3 Vector3Zero = {0.0, 0.0, 0.0};
|
|
||||||
|
|
||||||
const Color ColorBlack = {0, 0, 0, 0};
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_init --
|
|
||||||
*
|
|
||||||
* Create a new vector given x, y, and z coordinates.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_init(float x, float y, float z)
|
|
||||||
{
|
|
||||||
Vector3 v;
|
|
||||||
v.x = x;
|
|
||||||
v.y = y;
|
|
||||||
v.z = z;
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_add_vector
|
|
||||||
*
|
|
||||||
* Add a vector to another vector. Return a new vector.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_add_vector(Vector3 v, Vector3 a)
|
|
||||||
{
|
|
||||||
return vector_init(v.x + a.x, v.y + a.y, v.z + a.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_mul_scalar --
|
|
||||||
*
|
|
||||||
* Multiply a vector by a scalar. Return a new vector.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_mul_scalar(Vector3 v, float f)
|
|
||||||
{
|
|
||||||
return vector_init(f * v.x, f * v.y, f * v.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_sub_vector --
|
|
||||||
*
|
|
||||||
* m - s. Return a new vector.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_sub_vector(Vector3 m, Vector3 s)
|
|
||||||
{
|
|
||||||
return vector_init(m.x - s.x, m.y - s.y, m.z - s.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_negate --
|
|
||||||
*
|
|
||||||
* Negate a vector. Return a new vector.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_negate(Vector3 v)
|
|
||||||
{
|
|
||||||
return vector_init(-v.x, -v.y, -v.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_length2 --
|
|
||||||
*
|
|
||||||
* Return the length-squared of the given vector.
|
|
||||||
*/
|
|
||||||
float
|
|
||||||
vector_length2(Vector3 v)
|
|
||||||
{
|
|
||||||
return (v.x * v.x) + (v.y * v.y) + (v.z * v.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_length --
|
|
||||||
*
|
|
||||||
* Return the length of the given vector.
|
|
||||||
*/
|
|
||||||
float
|
|
||||||
vector_length(Vector3 v)
|
|
||||||
{
|
|
||||||
return sqrtf(vector_length2(v));
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_dot --
|
|
||||||
*
|
|
||||||
* Compute the dot product of v and f.
|
|
||||||
*/
|
|
||||||
float
|
|
||||||
vector_dot(Vector3 v, Vector3 f)
|
|
||||||
{
|
|
||||||
return (v.x * f.x) + (v.y * f.y) + (v.z * f.z);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* vector_normalize --
|
|
||||||
*
|
|
||||||
* Normalize the given vector. Return a new vector.
|
|
||||||
*/
|
|
||||||
Vector3
|
|
||||||
vector_normalize(Vector3 v)
|
|
||||||
{
|
|
||||||
float length2 = vector_length2(v);
|
|
||||||
if (length2 <= 0.0) {
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Multiplying by the inverse of the length is more efficient than dividing by the length.
|
|
||||||
float inverse_length = 1.0 / sqrtf(length2);
|
|
||||||
return vector_init(v.x * inverse_length, v.y * inverse_length, v.z * inverse_length);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Rects
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* rect_init --
|
|
||||||
*
|
|
||||||
* Create a new Rect given x, y coordinates, height, and width.
|
|
||||||
*/
|
|
||||||
Rect
|
|
||||||
rect_init(float x, float y, float w, float h)
|
|
||||||
{
|
|
||||||
Rect r;
|
|
||||||
r.x = x;
|
|
||||||
r.y = y;
|
|
||||||
r.h = h;
|
|
||||||
r.w = w;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Rays
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* ray_init --
|
|
||||||
*
|
|
||||||
* Create a new Ray.
|
|
||||||
*/
|
|
||||||
Ray
|
|
||||||
ray_init(Vector3 location, Vector3 direction)
|
|
||||||
{
|
|
||||||
Ray r;
|
|
||||||
r.location = location;
|
|
||||||
r.direction = direction;
|
|
||||||
return r;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Vector3
|
|
||||||
ray_parameterize(Ray ray, float t)
|
|
||||||
{
|
|
||||||
return vector_add_vector(ray.location, vector_mul_scalar(ray.direction, t));
|
|
||||||
}
|
|
133
src/basics.cpp
Normal file
133
src/basics.cpp
Normal file
|
@ -0,0 +1,133 @@
|
||||||
|
/* basics.c
|
||||||
|
*
|
||||||
|
* Definition of basic types: Vector.
|
||||||
|
*
|
||||||
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <cmath>
|
||||||
|
#include "basics.h"
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - Vectors
|
||||||
|
|
||||||
|
const Vector3 Vector3::Zero = Vector3();
|
||||||
|
|
||||||
|
|
||||||
|
Vector3::Vector3()
|
||||||
|
: Vector3(0.0, 0.0, 0.0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
Vector3::Vector3(float _x, float _y, float _z)
|
||||||
|
: x(_x), y(_y), z(_z)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
inline Vector3
|
||||||
|
Vector3::operator+(Vector3 v)
|
||||||
|
{
|
||||||
|
return Vector3(x + v.x, y + v.y, z + v.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Vector3
|
||||||
|
Vector3::operator*(float a)
|
||||||
|
{
|
||||||
|
return Vector3(a*x, a*y, a*z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Vector3
|
||||||
|
Vector3::operator-(Vector3 v)
|
||||||
|
{
|
||||||
|
return Vector3(x - v.x, y - v.y, z - v.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline Vector3
|
||||||
|
Vector3::operator-()
|
||||||
|
{
|
||||||
|
return Vector3(-x, -y, -z);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline float
|
||||||
|
Vector3::length2()
|
||||||
|
{
|
||||||
|
return x*x + y*y + z*z;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline float
|
||||||
|
Vector3::length()
|
||||||
|
{
|
||||||
|
return sqrtf(length2());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
inline float
|
||||||
|
Vector3::dot(Vector3 v)
|
||||||
|
{
|
||||||
|
return x*v.x + y*v.x + z*v.z;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
Vector3::normalize()
|
||||||
|
{
|
||||||
|
float len2 = length2();
|
||||||
|
if (len2 <= 0.0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Multiplying by the inverse of the length is more efficient than dividing by the length.
|
||||||
|
float inverse_length = 1.0 / sqrtf(len2);
|
||||||
|
x *= inverse_length;
|
||||||
|
y *= inverse_length;
|
||||||
|
z *= inverse_length;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Vector3
|
||||||
|
operator*(float a, Vector3 v)
|
||||||
|
{
|
||||||
|
return v * a;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - Rays
|
||||||
|
|
||||||
|
Ray::Ray()
|
||||||
|
: Ray(Vector3::Zero, Vector3::Zero)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
Ray::Ray(Vector3 o, Vector3 d)
|
||||||
|
: origin(o), direction(d)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
Vector3
|
||||||
|
Ray::parameterize(float t)
|
||||||
|
{
|
||||||
|
return origin + t * direction;
|
||||||
|
}
|
||||||
|
|
||||||
|
#pragma mark - Colors
|
||||||
|
|
||||||
|
const Color Color::Black = Color();
|
||||||
|
const Color Color::White = Color(1.0, 1.0, 1.0, 1.0);
|
||||||
|
const Color Color::Red = Color(1.0, 0.0, 0.0, 1.0);
|
||||||
|
const Color Color::Green = Color(0.0, 1.0, 0.0, 1.0);
|
||||||
|
const Color Color::Blue = Color(0.0, 0.0, 1.0, 1.0);
|
||||||
|
|
||||||
|
|
||||||
|
Color::Color()
|
||||||
|
: Color(0.0, 0.0, 0.0, 0.0)
|
||||||
|
{ }
|
||||||
|
|
||||||
|
|
||||||
|
Color::Color(float r, float g, float b, float a)
|
||||||
|
: red(r), green(g), blue(b), alpha(a)
|
||||||
|
{ }
|
76
src/basics.h
76
src/basics.h
|
@ -5,55 +5,55 @@
|
||||||
* Eryn Wells <eryn@erynwells.me>
|
* Eryn Wells <eryn@erynwells.me>
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef __BASICS_H
|
#ifndef __BASICS_H
|
||||||
#define __BASICS_H
|
#define __BASICS_H
|
||||||
|
|
||||||
#include <stdint.h>
|
struct Vector3
|
||||||
|
{
|
||||||
|
Vector3();
|
||||||
|
Vector3(float x, float y, float z);
|
||||||
|
|
||||||
|
Vector3 operator+(Vector3 v);
|
||||||
|
Vector3 operator*(float a);
|
||||||
|
Vector3 operator-(Vector3 v);
|
||||||
|
Vector3 operator-();
|
||||||
|
|
||||||
typedef struct {
|
float length2();
|
||||||
|
float length();
|
||||||
|
float dot(Vector3 v);
|
||||||
|
|
||||||
|
void normalize();
|
||||||
|
|
||||||
|
static const Vector3 Zero;
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
} Vector3;
|
};
|
||||||
|
|
||||||
|
Vector3 operator*(float a, Vector3 v);
|
||||||
|
|
||||||
|
|
||||||
extern const Vector3 Vector3Zero;
|
struct Ray
|
||||||
|
{
|
||||||
|
Ray();
|
||||||
|
Ray(Vector3 o, Vector3 d);
|
||||||
|
|
||||||
|
Vector3 parameterize(float t);
|
||||||
|
|
||||||
|
Vector3 origin, direction;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
Vector3 vector_init(float x, float y, float z);
|
struct Color
|
||||||
Vector3 vector_add_vector(Vector3 v, Vector3 a);
|
{
|
||||||
Vector3 vector_mul_scalar(Vector3 v, float f);
|
Color();
|
||||||
Vector3 vector_sub_vector(Vector3 m, Vector3 s);
|
Color(float r, float g, float b, float a);
|
||||||
Vector3 vector_negate(Vector3 v);
|
|
||||||
float vector_length2(Vector3 v);
|
|
||||||
float vector_length(Vector3 v);
|
|
||||||
float vector_dot(Vector3 v, Vector3 f);
|
|
||||||
|
|
||||||
Vector3 vector_normalize(Vector3 v);
|
static const Color Black;
|
||||||
|
static const Color White;
|
||||||
|
static const Color Red;
|
||||||
typedef struct {
|
static const Color Green;
|
||||||
float x, y;
|
static const Color Blue;
|
||||||
float w, h;
|
|
||||||
} Rect;
|
|
||||||
|
|
||||||
Rect rect_init(float x, float y, float h, float w);
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
Vector3 location;
|
|
||||||
Vector3 direction;
|
|
||||||
} Ray;
|
|
||||||
|
|
||||||
Ray ray_init(Vector3 location, Vector3 direction);
|
|
||||||
Vector3 ray_parameterize(Ray ray, float t);
|
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint8_t red, green, blue, alpha;
|
|
||||||
} Color;
|
|
||||||
|
|
||||||
extern const Color ColorBlack;
|
|
||||||
|
|
||||||
|
float red, green, blue, alpha;
|
||||||
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue