- change: organization structure of templates
1
NEWS.md
|
@ -2,6 +2,7 @@ Red Panda C++ Version 1.2
|
|||
|
||||
- enhancement: Portuguese Translation ( Thanks for crcpucmg@github)
|
||||
- fix: files in network drive is opened in readonly mode
|
||||
- change: organization structure of templates
|
||||
|
||||
Red Panda C++ Version 1.1.6
|
||||
|
||||
|
|
|
@ -802,6 +802,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
|
|||
}
|
||||
// Add list of files
|
||||
if (aTemplate->version() > 0) {
|
||||
QDir dir(aTemplate->folder());
|
||||
for (int i=0;i<aTemplate->unitCount();i++) {
|
||||
// Pick file contents
|
||||
PTemplateUnit templateUnit = aTemplate->unit(i);
|
||||
|
@ -811,7 +812,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
|
|||
if (!templateUnit->Target.isEmpty())
|
||||
target = templateUnit->Target;
|
||||
QFile::copy(
|
||||
QDir(pSettings->dirs().templateDir()).absoluteFilePath(templateUnit->Source),
|
||||
dir.absoluteFilePath(templateUnit->Source),
|
||||
includeTrailingPathDelimiter(this->directory())+target);
|
||||
unit = newUnit(mRootNode, target);
|
||||
} else {
|
||||
|
@ -831,7 +832,7 @@ bool Project::assignTemplate(const std::shared_ptr<ProjectTemplate> aTemplate, b
|
|||
true,
|
||||
true);
|
||||
|
||||
QString s2 = QDir(pSettings->dirs().templateDir()).absoluteFilePath(s);
|
||||
QString s2 = dir.absoluteFilePath(s);
|
||||
if (fileExists(s2) && !s.isEmpty()) {
|
||||
try {
|
||||
editor->loadFile(s2);
|
||||
|
|
|
@ -227,6 +227,11 @@ void ProjectTemplate::setFileName(const QString &newFileName)
|
|||
mFileName = newFileName;
|
||||
}
|
||||
|
||||
const QString ProjectTemplate::folder() const
|
||||
{
|
||||
return extractFileDir(mFileName);
|
||||
}
|
||||
|
||||
const QString &ProjectTemplate::icon() const
|
||||
{
|
||||
return mIcon;
|
||||
|
|
|
@ -52,6 +52,8 @@ public:
|
|||
const QString &fileName() const;
|
||||
void setFileName(const QString &newFileName);
|
||||
|
||||
const QString folder() const;
|
||||
|
||||
const QString &icon() const;
|
||||
void setIcon(const QString &newIcon);
|
||||
|
||||
|
|
|
@ -208,11 +208,6 @@ QString Settings::Dirs::appLibexecDir() const
|
|||
#endif
|
||||
}
|
||||
|
||||
QString Settings::Dirs::templateDir() const
|
||||
{
|
||||
return includeTrailingPathDelimiter(appResourceDir()) + "templates";
|
||||
}
|
||||
|
||||
QString Settings::Dirs::projectDir() const
|
||||
{
|
||||
return mProjectDir;
|
||||
|
@ -231,6 +226,8 @@ QString Settings::Dirs::data(Settings::Dirs::DataType dataType) const
|
|||
return ":/resources/iconsets";
|
||||
case DataType::Theme:
|
||||
return ":/themes";
|
||||
case DataType::Template:
|
||||
return includeTrailingPathDelimiter(appResourceDir()) + "templates";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
@ -249,6 +246,8 @@ QString Settings::Dirs::config(Settings::Dirs::DataType dataType) const
|
|||
return includeTrailingPathDelimiter(configDir)+"iconsets";
|
||||
case DataType::Theme:
|
||||
return includeTrailingPathDelimiter(configDir)+"themes";
|
||||
case DataType::Template:
|
||||
return includeTrailingPathDelimiter(configDir) + "templates";
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
|
|
@ -93,13 +93,13 @@ public:
|
|||
None,
|
||||
ColorScheme,
|
||||
IconSet,
|
||||
Theme
|
||||
Theme,
|
||||
Template
|
||||
};
|
||||
explicit Dirs(Settings * settings);
|
||||
QString appDir() const;
|
||||
QString appResourceDir() const;
|
||||
QString appLibexecDir() const;
|
||||
QString templateDir() const;
|
||||
QString projectDir() const;
|
||||
QString data(DataType dataType = DataType::None) const;
|
||||
QString config(DataType dataType = DataType::None) const;
|
||||
|
|
|
@ -78,6 +78,7 @@
|
|||
#define LIB_EXT "a"
|
||||
#define GCH_EXT "gch"
|
||||
#define TEMPLATE_EXT "template"
|
||||
#define TEMPLATE_INFO_FILE "info.template"
|
||||
#define DEV_INTERNAL_OPEN "$__DEV_INTERNAL_OPEN"
|
||||
#define DEV_LASTOPENS_FILE "lastopens.ini"
|
||||
#define DEV_SYMBOLUSAGE_FILE "symbolusage.json"
|
||||
|
|
|
@ -35,7 +35,8 @@ NewProjectDialog::NewProjectDialog(QWidget *parent) :
|
|||
mTemplatesTabBar->setExpanding(false);
|
||||
ui->verticalLayout->insertWidget(0,mTemplatesTabBar);
|
||||
|
||||
readTemplateDir();
|
||||
readTemplateDirs();
|
||||
|
||||
int i=0;
|
||||
QString projectName;
|
||||
QString location;
|
||||
|
@ -120,20 +121,34 @@ void NewProjectDialog::addTemplate(const QString &filename)
|
|||
mTemplates.append(t);
|
||||
}
|
||||
|
||||
void NewProjectDialog::readTemplateDir()
|
||||
void NewProjectDialog::readTemplateDirs()
|
||||
{
|
||||
addTemplate(":/templates/empty.template");
|
||||
readTemplateDir(pSettings->dirs().data(Settings::Dirs::DataType::Template));
|
||||
readTemplateDir(pSettings->dirs().config(Settings::Dirs::DataType::Template));
|
||||
rebuildTabs();
|
||||
updateView();
|
||||
}
|
||||
|
||||
void NewProjectDialog::readTemplateDir(const QString& folderPath)
|
||||
{
|
||||
|
||||
QString templateExt(".");
|
||||
templateExt += TEMPLATE_EXT;
|
||||
QDir dir(pSettings->dirs().templateDir());
|
||||
QDir dir(folderPath);
|
||||
if (!dir.exists())
|
||||
return;
|
||||
foreach (const QFileInfo& fileInfo,dir.entryInfoList()) {
|
||||
if (fileInfo.isFile()
|
||||
&& fileInfo.fileName().endsWith(templateExt)) {
|
||||
addTemplate(fileInfo.absoluteFilePath());
|
||||
} else if (fileInfo.isDir()) {
|
||||
QDir subDir(fileInfo.absoluteFilePath());
|
||||
if (subDir.exists(TEMPLATE_INFO_FILE)) {
|
||||
addTemplate(subDir.absoluteFilePath(TEMPLATE_INFO_FILE));
|
||||
}
|
||||
}
|
||||
}
|
||||
rebuildTabs();
|
||||
updateView();
|
||||
}
|
||||
|
||||
void NewProjectDialog::rebuildTabs()
|
||||
|
|
|
@ -55,7 +55,8 @@ private slots:
|
|||
|
||||
private:
|
||||
void addTemplate(const QString& filename);
|
||||
void readTemplateDir();
|
||||
void readTemplateDirs();
|
||||
void readTemplateDir(const QString& folderPath);
|
||||
void rebuildTabs();
|
||||
|
||||
private:
|
||||
|
|
|
@ -37,6 +37,9 @@
|
|||
<property name="itemAlignment">
|
||||
<set>Qt::AlignCenter</set>
|
||||
</property>
|
||||
<property name="sortingEnabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Windows Application
|
||||
Name[zh_CN]=Windows程序
|
||||
Icon=Windows.ico
|
||||
Description=A standard Windows application
|
||||
Description[zh_CN]=基于Windows API开发的图形界面应用程序
|
||||
Category=Basic
|
||||
Category[zh_CN]=基础
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=winapp_c.txt
|
||||
Cpp=winapp_c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=0
|
|
@ -1,19 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Console Application
|
||||
Name[zh_CN]=控制台程序
|
||||
Icon=ConsoleToo.ico
|
||||
Description=A console application (MS-DOS window)
|
||||
Description[zh_CN]=控制台应用程序
|
||||
Category=Basic
|
||||
Category[zh_CN]=基础
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=consoleapp_c.txt
|
||||
Cpp=consoleapp_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
|
@ -1,17 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Static Library
|
||||
Name[zh_CN]=静态链接库
|
||||
Icon=StaticLib.ico
|
||||
Description=A static library (.a)
|
||||
Description[zh_CN]=静态链接库(.a)
|
||||
Category=Basic
|
||||
Category[zh_CN]=基础
|
||||
|
||||
[Unit0]
|
||||
CName=
|
||||
CppName=
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=2
|
|
@ -1,28 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=DLL
|
||||
Name[zh_CN]=动态链接库
|
||||
Icon=DLL.ico
|
||||
Description=A Dynamic Link Library (DLL)
|
||||
Description[zh_CN]=动态链接库(DLL)
|
||||
Category=Basic
|
||||
Category[zh_CN]=基础
|
||||
|
||||
[Unit0]
|
||||
CName=dllmain.c
|
||||
CppName=dllmain.cpp
|
||||
C=DLL_c.txt
|
||||
Cpp=Dll_cpp.txt
|
||||
|
||||
[Unit1]
|
||||
CName=dll.h
|
||||
CppName=dll.h
|
||||
C=DLL_h.txt
|
||||
Cpp=Dll_hpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=2
|
||||
Type=3
|
||||
|
||||
Compiler=-DBUILDING_DLL=1
|
||||
CppCompiler=-DBUILDING_DLL=1
|
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,28 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=GLUT
|
||||
Icon=CL_GLUT.ico
|
||||
Description=A simple GLUT program
|
||||
Description[zh_CN]=一个简单的GLUT程序
|
||||
Category=3D
|
||||
Category[zh_CN]=3D
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=CL_GLUT_shapes.c.txt
|
||||
|
||||
[Unit1]
|
||||
CName=glmatrix.h
|
||||
C=CL_GLUT_glmatrix.h.txt
|
||||
|
||||
[Unit2]
|
||||
CName=glmatrix.c
|
||||
C=CL_GLUT_glmatrix.c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=3
|
||||
Type=0
|
||||
IsCpp=0
|
||||
linker=-lm -lfreeglut.dll -lopengl32 -lwinmm -lgdi32
|
||||
|
||||
|
|
@ -1,219 +0,0 @@
|
|||
#include <string.h>
|
||||
#define _USE_MATH_DEFINES
|
||||
#include <math.h>
|
||||
#include "glmatrix.h"
|
||||
|
||||
#ifndef M_PI
|
||||
#define M_PI 3.141592653589793
|
||||
#endif
|
||||
|
||||
#define MMODE_IDX(x) ((x) - GL_MODELVIEW)
|
||||
#define MAT_STACK_SIZE 32
|
||||
#define MAT_IDENT {1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}
|
||||
|
||||
static int mm_idx = 0;
|
||||
static float mat_stack[3][MAT_STACK_SIZE][16] = {{MAT_IDENT}, {MAT_IDENT}, {MAT_IDENT}};
|
||||
static int stack_top[3];
|
||||
|
||||
void gl_matrix_mode(int mm)
|
||||
{
|
||||
mm_idx = MMODE_IDX(mm);
|
||||
}
|
||||
|
||||
void gl_push_matrix(void)
|
||||
{
|
||||
int top = stack_top[mm_idx];
|
||||
|
||||
memcpy(mat_stack[mm_idx][top + 1], mat_stack[mm_idx][top], 16 * sizeof(float));
|
||||
stack_top[mm_idx]++;
|
||||
}
|
||||
|
||||
void gl_pop_matrix(void)
|
||||
{
|
||||
stack_top[mm_idx]--;
|
||||
}
|
||||
|
||||
void gl_load_identity(void)
|
||||
{
|
||||
static const float idmat[] = MAT_IDENT;
|
||||
int top = stack_top[mm_idx];
|
||||
float *mat = mat_stack[mm_idx][top];
|
||||
|
||||
memcpy(mat, idmat, sizeof idmat);
|
||||
}
|
||||
|
||||
void gl_load_matrixf(const float *m)
|
||||
{
|
||||
int top = stack_top[mm_idx];
|
||||
float *mat = mat_stack[mm_idx][top];
|
||||
|
||||
memcpy(mat, m, 16 * sizeof *mat);
|
||||
}
|
||||
|
||||
#define M4(i, j) ((i << 2) + j)
|
||||
|
||||
void gl_mult_matrixf(const float *m2)
|
||||
{
|
||||
int i, j;
|
||||
int top = stack_top[mm_idx];
|
||||
float *m1 = mat_stack[mm_idx][top];
|
||||
float res[16];
|
||||
|
||||
for(i=0; i<4; i++) {
|
||||
for(j=0; j<4; j++) {
|
||||
res[M4(i,j)] = m1[M4(i,0)] * m2[M4(0,j)] +
|
||||
m1[M4(i,1)] * m2[M4(1,j)] +
|
||||
m1[M4(i,2)] * m2[M4(2,j)] +
|
||||
m1[M4(i,3)] * m2[M4(3,j)];
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(m1, res, sizeof res);
|
||||
}
|
||||
|
||||
void gl_translatef(float x, float y, float z)
|
||||
{
|
||||
float mat[] = MAT_IDENT;
|
||||
|
||||
mat[12] = x;
|
||||
mat[13] = y;
|
||||
mat[14] = z;
|
||||
|
||||
gl_mult_matrixf(mat);
|
||||
}
|
||||
|
||||
void gl_rotatef(float angle, float x, float y, float z)
|
||||
{
|
||||
float mat[] = MAT_IDENT;
|
||||
|
||||
float angle_rad = (float)M_PI * angle / 180.f;
|
||||
float sina = (float)sin(angle_rad);
|
||||
float cosa = (float)cos(angle_rad);
|
||||
float one_minus_cosa = 1.f - cosa;
|
||||
float nxsq = x * x;
|
||||
float nysq = y * y;
|
||||
float nzsq = z * z;
|
||||
|
||||
mat[0] = nxsq + (1.f - nxsq) * cosa;
|
||||
mat[4] = x * y * one_minus_cosa - z * sina;
|
||||
mat[8] = x * z * one_minus_cosa + y * sina;
|
||||
mat[1] = x * y * one_minus_cosa + z * sina;
|
||||
mat[5] = nysq + (1.f - nysq) * cosa;
|
||||
mat[9] = y * z * one_minus_cosa - x * sina;
|
||||
mat[2] = x * z * one_minus_cosa - y * sina;
|
||||
mat[6] = y * z * one_minus_cosa + x * sina;
|
||||
mat[10] = nzsq + (1.f - nzsq) * cosa;
|
||||
|
||||
gl_mult_matrixf(mat);
|
||||
}
|
||||
|
||||
void gl_scalef(float x, float y, float z)
|
||||
{
|
||||
float mat[] = MAT_IDENT;
|
||||
|
||||
mat[0] = x;
|
||||
mat[5] = y;
|
||||
mat[10] = z;
|
||||
|
||||
gl_mult_matrixf(mat);
|
||||
}
|
||||
|
||||
void gl_ortho(float left, float right, float bottom, float top, float znear, float zfar)
|
||||
{
|
||||
float mat[] = MAT_IDENT;
|
||||
|
||||
float dx = right - left;
|
||||
float dy = top - bottom;
|
||||
float dz = zfar - znear;
|
||||
|
||||
float tx = -(right + left) / dx;
|
||||
float ty = -(top + bottom) / dy;
|
||||
float tz = -(zfar + znear) / dz;
|
||||
|
||||
float sx = 2.f / dx;
|
||||
float sy = 2.f / dy;
|
||||
float sz = -2.f / dz;
|
||||
|
||||
mat[0] = sx;
|
||||
mat[5] = sy;
|
||||
mat[10] = sz;
|
||||
mat[12] = tx;
|
||||
mat[13] = ty;
|
||||
mat[14] = tz;
|
||||
|
||||
gl_mult_matrixf(mat);
|
||||
}
|
||||
|
||||
void gl_frustum(float left, float right, float bottom, float top, float znear, float zfar)
|
||||
{
|
||||
float mat[] = MAT_IDENT;
|
||||
|
||||
float dx = right - left;
|
||||
float dy = top - bottom;
|
||||
float dz = zfar - znear;
|
||||
|
||||
float a = (right + left) / dx;
|
||||
float b = (top + bottom) / dy;
|
||||
float c = -(zfar + znear) / dz;
|
||||
float d = -2.f * zfar * znear / dz;
|
||||
|
||||
mat[0] = 2.f * znear / dx;
|
||||
mat[5] = 2.f * znear / dy;
|
||||
mat[8] = a;
|
||||
mat[9] = b;
|
||||
mat[10] = c;
|
||||
mat[11] = -1.f;
|
||||
mat[14] = d;
|
||||
mat[15] = 0;
|
||||
|
||||
gl_mult_matrixf(mat);
|
||||
}
|
||||
|
||||
void glu_perspective(float vfov, float aspect, float znear, float zfar)
|
||||
{
|
||||
float vfov_rad = (float)M_PI * vfov / 180.f;
|
||||
float x = znear * (float)tan(vfov_rad / 2.f);
|
||||
gl_frustum(-aspect * x, aspect * x, -x, x, znear, zfar);
|
||||
}
|
||||
|
||||
/* return the matrix (16 elements, 4x4 matrix, row-major order */
|
||||
float* get_matrix(int mm)
|
||||
{
|
||||
int idx = MMODE_IDX(mm);
|
||||
int top = stack_top[idx];
|
||||
return mat_stack[idx][top];
|
||||
}
|
||||
|
||||
|
||||
#define M3(i, j) ((i * 3) + j)
|
||||
static float inv_transpose_result[9];
|
||||
|
||||
/* return the inverse transpose of the left-upper 3x3 of a matrix
|
||||
The returned pointer is only valid until the next time this function is
|
||||
called, so make a deep copy when you want to keep it around.
|
||||
*/
|
||||
float* get_inv_transpose_3x3(int mm)
|
||||
{
|
||||
int idx = MMODE_IDX(mm);
|
||||
int top = stack_top[idx];
|
||||
float *m1 = mat_stack[idx][top];
|
||||
|
||||
|
||||
float determinant = +m1[M4(0,0)]*(m1[M4(1,1)]*m1[M4(2,2)]-m1[M4(2,1)]*m1[M4(1,2)])
|
||||
-m1[M4(0,1)]*(m1[M4(1,0)]*m1[M4(2,2)]-m1[M4(1,2)]*m1[M4(2,0)])
|
||||
+m1[M4(0,2)]*(m1[M4(1,0)]*m1[M4(2,1)]-m1[M4(1,1)]*m1[M4(2,0)]);
|
||||
|
||||
float invdet = 1/determinant;
|
||||
|
||||
inv_transpose_result[M3(0,0)] = (m1[M4(1,1)]*m1[M4(2,2)]-m1[M4(2,1)]*m1[M4(1,2)])*invdet;
|
||||
inv_transpose_result[M3(1,0)] = -(m1[M4(0,1)]*m1[M4(2,2)]-m1[M4(0,2)]*m1[M4(2,1)])*invdet;
|
||||
inv_transpose_result[M3(2,0)] = (m1[M4(0,1)]*m1[M4(1,2)]-m1[M4(0,2)]*m1[M4(1,1)])*invdet;
|
||||
inv_transpose_result[M3(0,1)] = -(m1[M4(1,0)]*m1[M4(2,2)]-m1[M4(1,2)]*m1[M4(2,0)])*invdet;
|
||||
inv_transpose_result[M3(1,1)] = (m1[M4(0,0)]*m1[M4(2,2)]-m1[M4(0,2)]*m1[M4(2,0)])*invdet;
|
||||
inv_transpose_result[M3(2,1)] = -(m1[M4(0,0)]*m1[M4(1,2)]-m1[M4(1,0)]*m1[M4(0,2)])*invdet;
|
||||
inv_transpose_result[M3(0,2)] = (m1[M4(1,0)]*m1[M4(2,1)]-m1[M4(2,0)]*m1[M4(1,1)])*invdet;
|
||||
inv_transpose_result[M3(1,2)] = -(m1[M4(0,0)]*m1[M4(2,1)]-m1[M4(2,0)]*m1[M4(0,1)])*invdet;
|
||||
inv_transpose_result[M3(2,2)] = (m1[M4(0,0)]*m1[M4(1,1)]-m1[M4(1,0)]*m1[M4(0,1)])*invdet;
|
||||
|
||||
return inv_transpose_result;
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
#ifndef GLMATRIX_H_
|
||||
#define GLMATRIX_H_
|
||||
|
||||
#ifndef GL_MODELVIEW
|
||||
#define GL_MODELVIEW 0x1700
|
||||
#endif
|
||||
#ifndef GL_PROJECTION
|
||||
#define GL_PROJECTION 0x1701
|
||||
#endif
|
||||
#ifndef GL_TEXTURE
|
||||
#define GL_TEXTURE 0x1702
|
||||
#endif
|
||||
|
||||
void gl_matrix_mode(int mmode);
|
||||
void gl_push_matrix(void);
|
||||
void gl_pop_matrix(void);
|
||||
void gl_load_identity(void);
|
||||
void gl_load_matrixf(const float *mat);
|
||||
void gl_mult_matrixf(const float *mat);
|
||||
void gl_translatef(float x, float y, float z);
|
||||
void gl_rotatef(float angle, float x, float y, float z);
|
||||
void gl_scalef(float x, float y, float z);
|
||||
void gl_ortho(float left, float right, float bottom, float top, float znear, float zfar);
|
||||
void gl_frustum(float left, float right, float bottom, float top, float znear, float zfar);
|
||||
void glu_perspective(float vfov, float aspect, float znear, float zfar);
|
||||
|
||||
/* getters */
|
||||
float* get_matrix(int mm);
|
||||
float* get_inv_transpose_3x3(int mm);
|
||||
|
||||
#endif /* GLMATRIX_H_ */
|
|
@ -1,946 +0,0 @@
|
|||
/*! \file shapes.c
|
||||
\ingroup demos
|
||||
|
||||
This program is a test harness for the various shapes
|
||||
in OpenGLUT. It may also be useful to see which
|
||||
parameters control what behavior in the OpenGLUT
|
||||
objects.
|
||||
|
||||
Spinning wireframe and solid-shaded shapes are
|
||||
displayed. Some parameters can be adjusted.
|
||||
|
||||
Keys:
|
||||
- <tt>Esc </tt> Quit
|
||||
- <tt>q Q </tt> Quit
|
||||
- <tt>i I </tt> Show info
|
||||
- <tt>p P </tt> Toggle perspective or orthographic projection
|
||||
- <tt>r R </tt> Toggle fixed or animated rotation around model X-axis
|
||||
- <tt>s S </tt> Toggle toggle fixed function or shader render path
|
||||
- <tt>n N </tt> Toggle visualization of object's normal vectors
|
||||
- <tt>= + </tt> Increase \a slices
|
||||
- <tt>- _ </tt> Decreate \a slices
|
||||
- <tt>, < </tt> Decreate \a stacks
|
||||
- <tt>. > </tt> Increase \a stacks
|
||||
- <tt>9 ( </tt> Decreate \a depth (Sierpinski Sponge)
|
||||
- <tt>0 ) </tt> Increase \a depth (Sierpinski Sponge)
|
||||
- <tt>up </tt> Increase "outer radius"
|
||||
- <tt>down </tt> Decrease "outer radius"
|
||||
- <tt>left </tt> Decrease "inner radius"
|
||||
- <tt>right</tt> Increase "inner radius"
|
||||
- <tt>PgUp </tt> Next shape-drawing function
|
||||
- <tt>PgDn </tt> Prev shape-drawing function
|
||||
|
||||
\author Written by Nigel Stewart November 2003
|
||||
|
||||
\author Portions Copyright (C) 2004, the OpenGLUT project contributors. <br>
|
||||
OpenGLUT branched from freeglut in February, 2004.
|
||||
|
||||
\image html openglut_shapes.png OpenGLUT Geometric Shapes Demonstration
|
||||
\include demos/shapes/shapes.c
|
||||
*/
|
||||
|
||||
#include <GL/freeglut.h>
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "glmatrix.h"
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* DUMP MEMORY LEAKS */
|
||||
#include <crtdbg.h>
|
||||
#endif
|
||||
|
||||
/* report GL errors, if any, to stderr */
|
||||
void checkError(const char *functionName)
|
||||
{
|
||||
GLenum error;
|
||||
while (( error = glGetError() ) != GL_NO_ERROR) {
|
||||
fprintf (stderr, "GL error 0x%X detected in %s\n", error, functionName);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* OpenGL 2+ shader mode needs some function and macro definitions,
|
||||
* avoiding a dependency on additional libraries like GLEW or the
|
||||
* GL/glext.h header
|
||||
*/
|
||||
#ifndef GL_FRAGMENT_SHADER
|
||||
#define GL_FRAGMENT_SHADER 0x8B30
|
||||
#endif
|
||||
|
||||
#ifndef GL_VERTEX_SHADER
|
||||
#define GL_VERTEX_SHADER 0x8B31
|
||||
#endif
|
||||
|
||||
#ifndef GL_COMPILE_STATUS
|
||||
#define GL_COMPILE_STATUS 0x8B81
|
||||
#endif
|
||||
|
||||
#ifndef GL_LINK_STATUS
|
||||
#define GL_LINK_STATUS 0x8B82
|
||||
#endif
|
||||
|
||||
#ifndef GL_INFO_LOG_LENGTH
|
||||
#define GL_INFO_LOG_LENGTH 0x8B84
|
||||
#endif
|
||||
|
||||
typedef ptrdiff_t ourGLsizeiptr;
|
||||
typedef char ourGLchar;
|
||||
|
||||
#ifndef APIENTRY
|
||||
#define APIENTRY
|
||||
#endif
|
||||
|
||||
#ifndef GL_VERSION_2_0
|
||||
typedef GLuint (APIENTRY *PFNGLCREATESHADERPROC) (GLenum type);
|
||||
typedef void (APIENTRY *PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const ourGLchar **string, const GLint *length);
|
||||
typedef void (APIENTRY *PFNGLCOMPILESHADERPROC) (GLuint shader);
|
||||
typedef GLuint (APIENTRY *PFNGLCREATEPROGRAMPROC) (void);
|
||||
typedef void (APIENTRY *PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
|
||||
typedef void (APIENTRY *PFNGLLINKPROGRAMPROC) (GLuint program);
|
||||
typedef void (APIENTRY *PFNGLUSEPROGRAMPROC) (GLuint program);
|
||||
typedef void (APIENTRY *PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
|
||||
typedef void (APIENTRY *PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, ourGLchar *infoLog);
|
||||
typedef void (APIENTRY *PFNGLGETPROGRAMIVPROC) (GLenum target, GLenum pname, GLint *params);
|
||||
typedef void (APIENTRY *PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, ourGLchar *infoLog);
|
||||
typedef GLint (APIENTRY *PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const ourGLchar *name);
|
||||
typedef GLint (APIENTRY *PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const ourGLchar *name);
|
||||
typedef void (APIENTRY *PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
|
||||
typedef void (APIENTRY *PFNGLUNIFORMMATRIX3FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
|
||||
#endif
|
||||
|
||||
PFNGLCREATESHADERPROC gl_CreateShader;
|
||||
PFNGLSHADERSOURCEPROC gl_ShaderSource;
|
||||
PFNGLCOMPILESHADERPROC gl_CompileShader;
|
||||
PFNGLCREATEPROGRAMPROC gl_CreateProgram;
|
||||
PFNGLATTACHSHADERPROC gl_AttachShader;
|
||||
PFNGLLINKPROGRAMPROC gl_LinkProgram;
|
||||
PFNGLUSEPROGRAMPROC gl_UseProgram;
|
||||
PFNGLGETSHADERIVPROC gl_GetShaderiv;
|
||||
PFNGLGETSHADERINFOLOGPROC gl_GetShaderInfoLog;
|
||||
PFNGLGETPROGRAMIVPROC gl_GetProgramiv;
|
||||
PFNGLGETPROGRAMINFOLOGPROC gl_GetProgramInfoLog;
|
||||
PFNGLGETATTRIBLOCATIONPROC gl_GetAttribLocation;
|
||||
PFNGLGETUNIFORMLOCATIONPROC gl_GetUniformLocation;
|
||||
PFNGLUNIFORMMATRIX4FVPROC gl_UniformMatrix4fv;
|
||||
PFNGLUNIFORMMATRIX3FVPROC gl_UniformMatrix3fv;
|
||||
|
||||
void initExtensionEntries(void)
|
||||
{
|
||||
gl_CreateShader = (PFNGLCREATESHADERPROC) glutGetProcAddress ("glCreateShader");
|
||||
gl_ShaderSource = (PFNGLSHADERSOURCEPROC) glutGetProcAddress ("glShaderSource");
|
||||
gl_CompileShader = (PFNGLCOMPILESHADERPROC) glutGetProcAddress ("glCompileShader");
|
||||
gl_CreateProgram = (PFNGLCREATEPROGRAMPROC) glutGetProcAddress ("glCreateProgram");
|
||||
gl_AttachShader = (PFNGLATTACHSHADERPROC) glutGetProcAddress ("glAttachShader");
|
||||
gl_LinkProgram = (PFNGLLINKPROGRAMPROC) glutGetProcAddress ("glLinkProgram");
|
||||
gl_UseProgram = (PFNGLUSEPROGRAMPROC) glutGetProcAddress ("glUseProgram");
|
||||
gl_GetShaderiv = (PFNGLGETSHADERIVPROC) glutGetProcAddress ("glGetShaderiv");
|
||||
gl_GetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC) glutGetProcAddress ("glGetShaderInfoLog");
|
||||
gl_GetProgramiv = (PFNGLGETPROGRAMIVPROC) glutGetProcAddress ("glGetProgramiv");
|
||||
gl_GetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC) glutGetProcAddress ("glGetProgramInfoLog");
|
||||
gl_GetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC) glutGetProcAddress ("glGetAttribLocation");
|
||||
gl_GetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC) glutGetProcAddress ("glGetUniformLocation");
|
||||
gl_UniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC) glutGetProcAddress ("glUniformMatrix4fv");
|
||||
gl_UniformMatrix3fv = (PFNGLUNIFORMMATRIX3FVPROC) glutGetProcAddress ("glUniformMatrix3fv");
|
||||
if (!gl_CreateShader || !gl_ShaderSource || !gl_CompileShader || !gl_CreateProgram || !gl_AttachShader || !gl_LinkProgram || !gl_UseProgram || !gl_GetShaderiv || !gl_GetShaderInfoLog || !gl_GetProgramiv || !gl_GetProgramInfoLog || !gl_GetAttribLocation || !gl_GetUniformLocation || !gl_UniformMatrix4fv || !gl_UniformMatrix3fv)
|
||||
{
|
||||
fprintf (stderr, "glCreateShader, glShaderSource, glCompileShader, glCreateProgram, glAttachShader, glLinkProgram, glUseProgram, glGetShaderiv, glGetShaderInfoLog, glGetProgramiv, glGetProgramInfoLog, glGetAttribLocation, glGetUniformLocation, glUniformMatrix4fv or gl_UniformMatrix3fv not found");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
const ourGLchar *vertexShaderSource[] = {
|
||||
"/**",
|
||||
" * From the OpenGL Programming wikibook: http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Smooth_Specular_Highlights",
|
||||
" * This file is in the public domain.",
|
||||
" * Contributors: Sylvain Beucler",
|
||||
" */",
|
||||
"attribute vec3 fg_coord;",
|
||||
"attribute vec3 fg_normal;",
|
||||
"varying vec4 position; /* position of the vertex (and fragment) in world space */",
|
||||
"varying vec3 varyingNormalDirection; /* surface normal vector in world space */",
|
||||
"uniform mat4 m, p; /* don't need v, as always identity in our demo */",
|
||||
"uniform mat3 m_3x3_inv_transp;",
|
||||
" ",
|
||||
"void main()",
|
||||
"{",
|
||||
" vec4 fg_coord4 = vec4(fg_coord, 1.0);",
|
||||
" position = m * fg_coord4;",
|
||||
" varyingNormalDirection = normalize(m_3x3_inv_transp * fg_normal);",
|
||||
" ",
|
||||
" mat4 mvp = p*m; /* normally p*v*m */",
|
||||
" gl_Position = mvp * fg_coord4;",
|
||||
"}"
|
||||
};
|
||||
|
||||
const ourGLchar *fragmentShaderSource[] = {
|
||||
"/**",
|
||||
" * From the OpenGL Programming wikibook: http://en.wikibooks.org/wiki/GLSL_Programming/GLUT/Smooth_Specular_Highlights",
|
||||
" * This file is in the public domain.",
|
||||
" * Contributors: Martin Kraus, Sylvain Beucler",
|
||||
" */",
|
||||
"varying vec4 position; /* position of the vertex (and fragment) in world space */",
|
||||
"varying vec3 varyingNormalDirection; /* surface normal vector in world space */",
|
||||
"/* uniform mat4 v_inv; // in this demo, the view matrix is always an identity matrix */",
|
||||
" ",
|
||||
"struct lightSource",
|
||||
"{",
|
||||
" vec4 position;",
|
||||
" vec4 diffuse;",
|
||||
" vec4 specular;",
|
||||
" float constantAttenuation, linearAttenuation, quadraticAttenuation;",
|
||||
" float spotCutoff, spotExponent;",
|
||||
" vec3 spotDirection;",
|
||||
"};",
|
||||
"lightSource light0 = lightSource(",
|
||||
" vec4(2.0, 5.0, 5.0, 0.0),",
|
||||
" vec4(1.0, 1.0, 1.0, 1.0),",
|
||||
" vec4(1.0, 1.0, 1.0, 1.0),",
|
||||
" 0.0, 1.0, 0.0,",
|
||||
" 180.0, 0.0,",
|
||||
" vec3(0.0, 0.0, 0.0)",
|
||||
");",
|
||||
"vec4 scene_ambient = vec4(0.2, 0.2, 0.2, 1.0);",
|
||||
" ",
|
||||
"struct material",
|
||||
"{",
|
||||
" vec4 ambient;",
|
||||
" vec4 diffuse;",
|
||||
" vec4 specular;",
|
||||
" float shininess;",
|
||||
"};",
|
||||
"material frontMaterial = material(",
|
||||
" vec4(1.0, 0.0, 0.0, 1.0),",
|
||||
" vec4(1.0, 0.0, 0.0, 1.0),",
|
||||
" vec4(1.0, 1.0, 1.0, 1.0),",
|
||||
" 100.0",
|
||||
");",
|
||||
" ",
|
||||
"void main()",
|
||||
"{",
|
||||
" vec3 normalDirection = normalize(varyingNormalDirection);",
|
||||
" /* vec3 viewDirection = normalize(vec3(v_inv * vec4(0.0, 0.0, 0.0, 1.0) - position)); */",
|
||||
" vec3 viewDirection = normalize(vec3(vec4(0.0, 0.0, 0.0, 1.0) - position)); /* in this demo, the view matrix is always an identity matrix */",
|
||||
" vec3 lightDirection;",
|
||||
" float attenuation;",
|
||||
" ",
|
||||
" if (0.0 == light0.position.w) /* directional light? */",
|
||||
" {",
|
||||
" attenuation = 1.0; /* no attenuation */",
|
||||
" lightDirection = normalize(vec3(light0.position));",
|
||||
" } ",
|
||||
" else /* point light or spotlight (or other kind of light) */",
|
||||
" {",
|
||||
" vec3 positionToLightSource = vec3(light0.position - position);",
|
||||
" float distance = length(positionToLightSource);",
|
||||
" lightDirection = normalize(positionToLightSource);",
|
||||
" attenuation = 1.0 / (light0.constantAttenuation",
|
||||
" + light0.linearAttenuation * distance",
|
||||
" + light0.quadraticAttenuation * distance * distance);",
|
||||
" ",
|
||||
" if (light0.spotCutoff <= 90.0) /* spotlight? */",
|
||||
" {",
|
||||
" float clampedCosine = max(0.0, dot(-lightDirection, light0.spotDirection));",
|
||||
" if (clampedCosine < cos(radians(light0.spotCutoff))) /* outside of spotlight cone? */",
|
||||
" {",
|
||||
" attenuation = 0.0;",
|
||||
" }",
|
||||
" else",
|
||||
" {",
|
||||
" attenuation = attenuation * pow(clampedCosine, light0.spotExponent); ",
|
||||
" }",
|
||||
" }",
|
||||
" }",
|
||||
" ",
|
||||
" vec3 ambientLighting = vec3(scene_ambient) * vec3(frontMaterial.ambient);",
|
||||
" ",
|
||||
" vec3 diffuseReflection = attenuation ",
|
||||
" * vec3(light0.diffuse) * vec3(frontMaterial.diffuse)",
|
||||
" * max(0.0, dot(normalDirection, lightDirection));",
|
||||
" ",
|
||||
" vec3 specularReflection;",
|
||||
" if (dot(normalDirection, lightDirection) < 0.0) /* light source on the wrong side? */",
|
||||
" {",
|
||||
" specularReflection = vec3(0.0, 0.0, 0.0); /* no specular reflection */",
|
||||
" }",
|
||||
" else /* light source on the right side */",
|
||||
" {",
|
||||
" specularReflection = attenuation * vec3(light0.specular) * vec3(frontMaterial.specular) ",
|
||||
" * pow(max(0.0, dot(reflect(-lightDirection, normalDirection), viewDirection)), frontMaterial.shininess);",
|
||||
" }",
|
||||
" ",
|
||||
" gl_FragColor = vec4(ambientLighting + diffuseReflection + specularReflection, 1.0);",
|
||||
"}"
|
||||
};
|
||||
|
||||
GLint getAttribOrUniformLocation(const char* name, GLuint program, GLboolean isAttrib)
|
||||
{
|
||||
if (isAttrib)
|
||||
{
|
||||
GLint attrib = gl_GetAttribLocation(program, name);
|
||||
if (attrib == -1)
|
||||
{
|
||||
fprintf(stderr, "Warning: Could not bind attrib %s\n", name);
|
||||
}
|
||||
|
||||
checkError ("getAttribOrUniformLocation");
|
||||
return attrib;
|
||||
}
|
||||
else
|
||||
{
|
||||
GLint uniform = gl_GetUniformLocation(program, name);
|
||||
if (uniform == -1)
|
||||
{
|
||||
fprintf(stderr, "Warning: Could not bind uniform %s\n", name);
|
||||
}
|
||||
|
||||
checkError ("getAttribOrUniformLocation");
|
||||
return uniform;
|
||||
}
|
||||
}
|
||||
|
||||
GLuint program;
|
||||
GLint attribute_fg_coord = -1, attribute_fg_normal = -1;
|
||||
GLint uniform_m = -1, uniform_p = -1, uniform_m_3x3_inv_transp = -1;
|
||||
GLint shaderReady = 0; /* Set to 1 when all initialization went well, to -1 when shader somehow unusable. */
|
||||
|
||||
|
||||
|
||||
void compileAndCheck(GLuint shader)
|
||||
{
|
||||
GLint status;
|
||||
gl_CompileShader (shader);
|
||||
gl_GetShaderiv (shader, GL_COMPILE_STATUS, &status);
|
||||
if (status == GL_FALSE) {
|
||||
GLint infoLogLength;
|
||||
ourGLchar *infoLog;
|
||||
gl_GetShaderiv (shader, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||
infoLog = (ourGLchar*) malloc (infoLogLength);
|
||||
gl_GetShaderInfoLog (shader, infoLogLength, NULL, infoLog);
|
||||
fprintf (stderr, "compile log: %s\n", infoLog);
|
||||
free (infoLog);
|
||||
}
|
||||
checkError ("compileAndCheck");
|
||||
}
|
||||
|
||||
GLuint compileShaderSource(GLenum type, GLsizei count, const ourGLchar **string)
|
||||
{
|
||||
GLuint shader = gl_CreateShader (type);
|
||||
gl_ShaderSource (shader, count, string, NULL);
|
||||
|
||||
checkError ("compileShaderSource");
|
||||
|
||||
compileAndCheck (shader);
|
||||
return shader;
|
||||
}
|
||||
|
||||
void linkAndCheck(GLuint program)
|
||||
{
|
||||
GLint status;
|
||||
gl_LinkProgram (program);
|
||||
gl_GetProgramiv (program, GL_LINK_STATUS, &status);
|
||||
if (status == GL_FALSE) {
|
||||
GLint infoLogLength;
|
||||
ourGLchar *infoLog;
|
||||
gl_GetProgramiv (program, GL_INFO_LOG_LENGTH, &infoLogLength);
|
||||
infoLog = (ourGLchar*) malloc (infoLogLength);
|
||||
gl_GetProgramInfoLog (program, infoLogLength, NULL, infoLog);
|
||||
fprintf (stderr, "link log: %s\n", infoLog);
|
||||
free (infoLog);
|
||||
}
|
||||
checkError ("linkAndCheck");
|
||||
}
|
||||
|
||||
void createProgram(GLuint vertexShader, GLuint fragmentShader)
|
||||
{
|
||||
program = gl_CreateProgram ();
|
||||
if (vertexShader != 0) {
|
||||
gl_AttachShader (program, vertexShader);
|
||||
}
|
||||
if (fragmentShader != 0) {
|
||||
gl_AttachShader (program, fragmentShader);
|
||||
}
|
||||
|
||||
checkError ("createProgram");
|
||||
|
||||
linkAndCheck (program);
|
||||
}
|
||||
|
||||
void initShader(void)
|
||||
{
|
||||
const GLsizei vertexShaderLines = sizeof(vertexShaderSource) / sizeof(ourGLchar*);
|
||||
GLuint vertexShader =
|
||||
compileShaderSource (GL_VERTEX_SHADER, vertexShaderLines, vertexShaderSource);
|
||||
|
||||
const GLsizei fragmentShaderLines = sizeof(fragmentShaderSource) / sizeof(ourGLchar*);
|
||||
GLuint fragmentShader =
|
||||
compileShaderSource (GL_FRAGMENT_SHADER, fragmentShaderLines, fragmentShaderSource);
|
||||
|
||||
checkError ("initShader - 1");
|
||||
|
||||
createProgram (vertexShader, fragmentShader);
|
||||
|
||||
gl_UseProgram (program);
|
||||
|
||||
attribute_fg_coord = getAttribOrUniformLocation("fg_coord" , program, GL_TRUE);
|
||||
attribute_fg_normal = getAttribOrUniformLocation("fg_normal" , program, GL_TRUE);
|
||||
uniform_m = getAttribOrUniformLocation("m" , program, GL_FALSE);
|
||||
uniform_p = getAttribOrUniformLocation("p" , program, GL_FALSE);
|
||||
uniform_m_3x3_inv_transp= getAttribOrUniformLocation("m_3x3_inv_transp" , program, GL_FALSE);
|
||||
|
||||
gl_UseProgram (0);
|
||||
|
||||
if (attribute_fg_coord==-1 || attribute_fg_normal==-1 ||
|
||||
uniform_m==-1 || uniform_p==-1 || uniform_m_3x3_inv_transp==-1)
|
||||
shaderReady = -1;
|
||||
else
|
||||
shaderReady = 1;
|
||||
|
||||
checkError ("initShader - 2");
|
||||
}
|
||||
|
||||
/*
|
||||
* This macro is only intended to be used on arrays, of course.
|
||||
*/
|
||||
#define NUMBEROF(x) ((sizeof(x))/(sizeof(x[0])))
|
||||
|
||||
/*
|
||||
* These global variables control which object is drawn,
|
||||
* and how it is drawn. No object uses all of these
|
||||
* variables.
|
||||
*/
|
||||
static int function_index;
|
||||
static int slices = 16;
|
||||
static int stacks = 16;
|
||||
static double irad = .25;
|
||||
static double orad = 1.0; /* doubles as size for objects other than Torus */
|
||||
static int depth = 4;
|
||||
static double offset[ 3 ] = { 0, 0, 0 };
|
||||
static GLboolean show_info = GL_TRUE;
|
||||
static float ar;
|
||||
static GLboolean persProject = GL_TRUE;
|
||||
static GLboolean animateXRot = GL_FALSE;
|
||||
static GLboolean useShader = GL_FALSE;
|
||||
static GLboolean visNormals = GL_FALSE;
|
||||
static GLboolean flat;
|
||||
|
||||
/*
|
||||
* Enum to tell drawSizeInfo what to draw for each object
|
||||
*/
|
||||
#define GEO_NO_SIZE 0
|
||||
#define GEO_SIZE 1
|
||||
#define GEO_SCALE 2
|
||||
#define GEO_INNER_OUTER_RAD 4
|
||||
#define GEO_RAD 8
|
||||
#define GEO_BASE_HEIGHT 16
|
||||
#define GEO_RAD_HEIGHT 32
|
||||
|
||||
/*
|
||||
* These one-liners draw particular objects, fetching appropriate
|
||||
* information from the above globals. They are just thin wrappers
|
||||
* for the FreeGLUT objects.
|
||||
*/
|
||||
static void drawSolidTetrahedron(void) { glutSolidTetrahedron (); }
|
||||
static void drawWireTetrahedron(void) { glutWireTetrahedron (); }
|
||||
static void drawSolidCube(void) { glutSolidCube(orad); } /* orad doubles as size input */
|
||||
static void drawWireCube(void) { glutWireCube(orad); } /* orad doubles as size input */
|
||||
static void drawSolidOctahedron(void) { glutSolidOctahedron (); }
|
||||
static void drawWireOctahedron(void) { glutWireOctahedron (); }
|
||||
static void drawSolidDodecahedron(void) { glutSolidDodecahedron (); }
|
||||
static void drawWireDodecahedron(void) { glutWireDodecahedron (); }
|
||||
static void drawSolidRhombicDodecahedron(void) { glutSolidRhombicDodecahedron (); }
|
||||
static void drawWireRhombicDodecahedron(void) { glutWireRhombicDodecahedron (); }
|
||||
static void drawSolidIcosahedron(void) { glutSolidIcosahedron (); }
|
||||
static void drawWireIcosahedron(void) { glutWireIcosahedron (); }
|
||||
static void drawSolidSierpinskiSponge(void) { glutSolidSierpinskiSponge (depth, offset, orad);} /* orad doubles as size input */
|
||||
static void drawWireSierpinskiSponge(void) { glutWireSierpinskiSponge (depth, offset, orad); } /* orad doubles as size input */
|
||||
static void drawSolidTorus(void) { glutSolidTorus(irad,orad,slices,stacks); }
|
||||
static void drawWireTorus(void) { glutWireTorus (irad,orad,slices,stacks); }
|
||||
static void drawSolidSphere(void) { glutSolidSphere(orad,slices,stacks); } /* orad doubles as size input */
|
||||
static void drawWireSphere(void) { glutWireSphere(orad,slices,stacks); } /* orad doubles as size input */
|
||||
static void drawSolidCone(void) { glutSolidCone(irad,orad,slices,stacks); } /* irad doubles as base input, and orad as height input */
|
||||
static void drawWireCone(void) { glutWireCone(irad,orad,slices,stacks); } /* irad doubles as base input, and orad as height input */
|
||||
static void drawSolidCylinder(void) { glutSolidCylinder(irad,orad,slices,stacks); } /* irad doubles as radius input, and orad as height input */
|
||||
static void drawWireCylinder(void) { glutWireCylinder(irad,orad,slices,stacks); } /* irad doubles as radius input, and orad as height input */
|
||||
/* per Glut manpage, it should be noted that the teapot is rendered
|
||||
* with clockwise winding for front facing polygons...
|
||||
* Same for the teacup and teaspoon
|
||||
*/
|
||||
static void drawSolidTeapot(void)
|
||||
{ glFrontFace(GL_CW); glutSolidTeapot(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
static void drawWireTeapot(void)
|
||||
{ glFrontFace(GL_CW); glutWireTeapot(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
static void drawSolidTeacup(void)
|
||||
{ glFrontFace(GL_CW); glutSolidTeacup(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
static void drawWireTeacup(void)
|
||||
{ glFrontFace(GL_CW); glutWireTeacup(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
static void drawSolidTeaspoon(void)
|
||||
{ glFrontFace(GL_CW); glutSolidTeaspoon(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
static void drawWireTeaspoon(void)
|
||||
{ glFrontFace(GL_CW); glutWireTeaspoon(orad); glFrontFace(GL_CCW); /* orad doubles as size input */}
|
||||
|
||||
#define RADIUSFAC 0.70710678118654752440084436210485f
|
||||
|
||||
static void drawSolidCuboctahedron(void)
|
||||
{
|
||||
GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */
|
||||
glBegin( GL_TRIANGLES );
|
||||
glNormal3d( 0.577350269189, 0.577350269189, 0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius ); glVertex3d( radius, 0.0, radius );
|
||||
glNormal3d( 0.577350269189, 0.577350269189,-0.577350269189); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
|
||||
glNormal3d( 0.577350269189,-0.577350269189, 0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
|
||||
glNormal3d( 0.577350269189,-0.577350269189,-0.577350269189); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius ); glVertex3d( radius, 0.0,-radius );
|
||||
glNormal3d(-0.577350269189, 0.577350269189, 0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0, radius, radius );
|
||||
glNormal3d(-0.577350269189, 0.577350269189,-0.577350269189); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, 0.0,-radius );
|
||||
glNormal3d(-0.577350269189,-0.577350269189, 0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius, 0.0, radius );
|
||||
glNormal3d(-0.577350269189,-0.577350269189,-0.577350269189); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius );
|
||||
glEnd();
|
||||
|
||||
glBegin( GL_QUADS );
|
||||
glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius );
|
||||
glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius );
|
||||
glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius );
|
||||
glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius );
|
||||
glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
|
||||
glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
|
||||
glEnd();
|
||||
}
|
||||
|
||||
static void drawWireCuboctahedron(void)
|
||||
{
|
||||
GLfloat radius = RADIUSFAC*(GLfloat)orad; /* orad doubles as size */
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d( 1.0, 0.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( radius, 0.0,-radius );
|
||||
glEnd();
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d(-1.0, 0.0, 0.0 ); glVertex3d(-radius, radius, 0.0 ); glVertex3d(-radius, 0.0,-radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d(-radius, 0.0, radius );
|
||||
glEnd();
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d( 0.0, 1.0, 0.0 ); glVertex3d( radius, radius, 0.0 ); glVertex3d( 0.0, radius,-radius ); glVertex3d(-radius, radius, 0.0 ); glVertex3d( 0.0, radius, radius );
|
||||
glEnd();
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d( 0.0,-1.0, 0.0 ); glVertex3d( radius,-radius, 0.0 ); glVertex3d( 0.0,-radius, radius ); glVertex3d(-radius,-radius, 0.0 ); glVertex3d( 0.0,-radius,-radius );
|
||||
glEnd();
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d( 0.0, 0.0, 1.0 ); glVertex3d( radius, 0.0, radius ); glVertex3d( 0.0, radius, radius ); glVertex3d(-radius, 0.0, radius ); glVertex3d( 0.0,-radius, radius );
|
||||
glEnd();
|
||||
glBegin( GL_LINE_LOOP );
|
||||
glNormal3d( 0.0, 0.0,-1.0 ); glVertex3d( radius, 0.0,-radius ); glVertex3d( 0.0,-radius,-radius ); glVertex3d(-radius, 0.0,-radius ); glVertex3d( 0.0, radius,-radius );
|
||||
glEnd();
|
||||
}
|
||||
|
||||
#undef RADIUSFAC
|
||||
|
||||
/*
|
||||
* This structure defines an entry in our function-table.
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
const char * const name;
|
||||
void (*solid) (void);
|
||||
void (*wire) (void);
|
||||
int drawSizeInfoFlag;
|
||||
} entry;
|
||||
|
||||
#define ENTRY(e,f) {#e, drawSolid##e, drawWire##e,f}
|
||||
static const entry table [] =
|
||||
{
|
||||
ENTRY (Tetrahedron,GEO_NO_SIZE),
|
||||
ENTRY (Cube,GEO_SIZE),
|
||||
ENTRY (Octahedron,GEO_NO_SIZE),
|
||||
ENTRY (Dodecahedron,GEO_NO_SIZE),
|
||||
ENTRY (RhombicDodecahedron,GEO_NO_SIZE),
|
||||
ENTRY (Icosahedron,GEO_NO_SIZE),
|
||||
ENTRY (SierpinskiSponge,GEO_SCALE),
|
||||
ENTRY (Teapot,GEO_SIZE),
|
||||
ENTRY (Teacup,GEO_SIZE),
|
||||
ENTRY (Teaspoon,GEO_SIZE),
|
||||
ENTRY (Torus,GEO_INNER_OUTER_RAD),
|
||||
ENTRY (Sphere,GEO_RAD),
|
||||
ENTRY (Cone,GEO_BASE_HEIGHT),
|
||||
ENTRY (Cylinder,GEO_RAD_HEIGHT),
|
||||
ENTRY (Cuboctahedron,GEO_SIZE) /* This one doesn't work when in shader mode and is then skipped */
|
||||
};
|
||||
#undef ENTRY
|
||||
|
||||
/*!
|
||||
Does printf()-like work using freeglut
|
||||
glutBitmapString(). Uses a fixed font. Prints
|
||||
at the indicated row/column position.
|
||||
|
||||
Limitation: Cannot address pixels.
|
||||
Limitation: Renders in screen coords, not model coords.
|
||||
*/
|
||||
static void shapesPrintf (int row, int col, const char *fmt, ...)
|
||||
{
|
||||
static char buf[256];
|
||||
int viewport[4];
|
||||
void *font = GLUT_BITMAP_9_BY_15;
|
||||
va_list args;
|
||||
|
||||
va_start(args, fmt);
|
||||
#if defined(WIN32) && !defined(__CYGWIN__)
|
||||
(void) _vsnprintf (buf, sizeof(buf), fmt, args);
|
||||
#else
|
||||
(void) vsnprintf (buf, sizeof(buf), fmt, args);
|
||||
#endif
|
||||
va_end(args);
|
||||
|
||||
glGetIntegerv(GL_VIEWPORT,viewport);
|
||||
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glPushMatrix();
|
||||
glLoadIdentity();
|
||||
|
||||
glOrtho(0,viewport[2],0,viewport[3],-1,1);
|
||||
|
||||
glRasterPos2i
|
||||
(
|
||||
glutBitmapWidth(font, ' ') * col,
|
||||
- glutBitmapHeight(font) * row + viewport[3]
|
||||
);
|
||||
glutBitmapString (font, (unsigned char*)buf);
|
||||
|
||||
glPopMatrix();
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
/* Print info about the about the current shape and render state on the screen */
|
||||
static void DrawSizeInfo(int *row)
|
||||
{
|
||||
switch (table [function_index].drawSizeInfoFlag)
|
||||
{
|
||||
case GEO_NO_SIZE:
|
||||
break;
|
||||
case GEO_SIZE:
|
||||
shapesPrintf ((*row)++, 1, "Size Up Down : %f", orad);
|
||||
break;
|
||||
case GEO_SCALE:
|
||||
shapesPrintf ((*row)++, 1, "Scale Up Down : %f", orad);
|
||||
break;
|
||||
case GEO_INNER_OUTER_RAD:
|
||||
shapesPrintf ((*row)++, 1, "Inner radius Left Right: %f", irad);
|
||||
shapesPrintf ((*row)++, 1, "Outer radius Up Down : %f", orad);
|
||||
break;
|
||||
case GEO_RAD:
|
||||
shapesPrintf ((*row)++, 1, "Radius Up Down : %f", orad);
|
||||
break;
|
||||
case GEO_BASE_HEIGHT:
|
||||
shapesPrintf ((*row)++, 1, "Base Left Right: %f", irad);
|
||||
shapesPrintf ((*row)++, 1, "Height Up Down : %f", orad);
|
||||
break;
|
||||
case GEO_RAD_HEIGHT:
|
||||
shapesPrintf ((*row)++, 1, "Radius Left Right: %f", irad);
|
||||
shapesPrintf ((*row)++, 1, "Height Up Down : %f", orad);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void drawInfo()
|
||||
{
|
||||
int row = 1;
|
||||
shapesPrintf (row++, 1, "Shape PgUp PgDn: %s", table [function_index].name);
|
||||
shapesPrintf (row++, 1, "Slices +-: %d Stacks <>: %d", slices, stacks);
|
||||
shapesPrintf (row++, 1, "nSides +-: %d nRings <>: %d", slices, stacks);
|
||||
shapesPrintf (row++, 1, "Depth (): %d", depth);
|
||||
DrawSizeInfo(&row);
|
||||
if (persProject)
|
||||
shapesPrintf (row++, 1, "Perspective projection (p)");
|
||||
else
|
||||
shapesPrintf (row++, 1, "Orthographic projection (p)");
|
||||
if (useShader) {
|
||||
shapesPrintf (row++, 1, "Using shader (s)");
|
||||
} else {
|
||||
shapesPrintf (row++, 1, "Using fixed function pipeline (s)");
|
||||
if (flat)
|
||||
shapesPrintf (row++, 1, "Flat shading (f)");
|
||||
else
|
||||
shapesPrintf (row++, 1, "Smooth shading (f)");
|
||||
}
|
||||
if (animateXRot)
|
||||
shapesPrintf (row++, 1, "2D rotation (r)");
|
||||
else
|
||||
shapesPrintf (row++, 1, "1D rotation (r)");
|
||||
shapesPrintf (row++, 1, "visualizing normals: %i (n)",visNormals);
|
||||
}
|
||||
|
||||
/* GLUT callback Handlers */
|
||||
static void
|
||||
resize(int width, int height)
|
||||
{
|
||||
ar = (float) width / (float) height;
|
||||
|
||||
glViewport(0, 0, width, height);
|
||||
}
|
||||
|
||||
static void display(void)
|
||||
{
|
||||
const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
|
||||
const double a = t*89.0;
|
||||
const double b = (animateXRot?t:1)*67.0;
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glutSetOption(GLUT_GEOMETRY_VISUALIZE_NORMALS,visNormals); /* Normals visualized or not? */
|
||||
|
||||
glShadeModel(flat ? GL_FLAT : GL_SMOOTH); /* flat or gouraud shading */
|
||||
|
||||
if (useShader && !shaderReady)
|
||||
initShader();
|
||||
|
||||
if (useShader && shaderReady)
|
||||
{
|
||||
/* setup use of shader (and vertex buffer by FreeGLUT) */
|
||||
gl_UseProgram (program);
|
||||
glutSetVertexAttribCoord3(attribute_fg_coord);
|
||||
glutSetVertexAttribNormal(attribute_fg_normal);
|
||||
/* There is also a glutSetVertexAttribTexCoord2, which is used only when drawing the teapot, teacup or teaspoon */
|
||||
|
||||
gl_matrix_mode(GL_PROJECTION);
|
||||
gl_load_identity();
|
||||
if (persProject)
|
||||
gl_frustum(-ar, ar, -1.f, 1.f, 2.f, 100.f);
|
||||
else
|
||||
gl_ortho(-ar*3, ar*3, -3.f, 3.f, 2.f, 100.f);
|
||||
gl_UniformMatrix4fv (uniform_p, 1, GL_FALSE, get_matrix(GL_PROJECTION));
|
||||
|
||||
|
||||
gl_matrix_mode(GL_MODELVIEW);
|
||||
gl_load_identity();
|
||||
|
||||
gl_push_matrix();
|
||||
/* Not in reverse order like normal OpenGL, our util library multiplies the matrices in the order they are specified in */
|
||||
gl_rotatef((float)a,0,0,1);
|
||||
gl_rotatef((float)b,1,0,0);
|
||||
gl_translatef(0,1.2f,-6);
|
||||
gl_UniformMatrix4fv (uniform_m , 1, GL_FALSE, get_matrix(GL_MODELVIEW));
|
||||
gl_UniformMatrix3fv (uniform_m_3x3_inv_transp, 1, GL_FALSE, get_inv_transpose_3x3(GL_MODELVIEW));
|
||||
table [function_index].solid ();
|
||||
gl_pop_matrix();
|
||||
|
||||
gl_push_matrix();
|
||||
gl_rotatef((float)a,0,0,1);
|
||||
gl_rotatef((float)b,1,0,0);
|
||||
gl_translatef(0,-1.2f,-6);
|
||||
gl_UniformMatrix4fv (uniform_m , 1, GL_FALSE, get_matrix(GL_MODELVIEW));
|
||||
gl_UniformMatrix3fv (uniform_m_3x3_inv_transp, 1, GL_FALSE, get_inv_transpose_3x3(GL_MODELVIEW));
|
||||
table [function_index].wire ();
|
||||
gl_pop_matrix();
|
||||
|
||||
gl_UseProgram (0);
|
||||
glutSetVertexAttribCoord3(-1);
|
||||
glutSetVertexAttribNormal(-1);
|
||||
|
||||
checkError ("display");
|
||||
}
|
||||
else
|
||||
{
|
||||
/* fixed function pipeline */
|
||||
glMatrixMode(GL_PROJECTION);
|
||||
glLoadIdentity();
|
||||
if (persProject)
|
||||
glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);
|
||||
else
|
||||
glOrtho(-ar*3, ar*3, -3.0, 3.0, 2.0, 100.0);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glLoadIdentity();
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
|
||||
glColor3d(1,0,0);
|
||||
|
||||
glPushMatrix();
|
||||
glTranslated(0,1.2,-6);
|
||||
glRotated(b,1,0,0);
|
||||
glRotated(a,0,0,1);
|
||||
table [function_index].solid ();
|
||||
glPopMatrix();
|
||||
|
||||
glPushMatrix();
|
||||
glTranslated(0,-1.2,-6);
|
||||
glRotated(b,1,0,0);
|
||||
glRotated(a,0,0,1);
|
||||
table [function_index].wire ();
|
||||
glPopMatrix();
|
||||
|
||||
glDisable(GL_LIGHTING);
|
||||
glColor3d(0.1,0.1,0.4);
|
||||
}
|
||||
|
||||
if( show_info )
|
||||
/* print info to screen */
|
||||
drawInfo();
|
||||
else
|
||||
/* print to command line instead */
|
||||
printf ( "Shape %d slides %d stacks %d\n", function_index, slices, stacks ) ;
|
||||
|
||||
glutSwapBuffers();
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
key(unsigned char key, int x, int y)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case 27 :
|
||||
case 'Q':
|
||||
case 'q': glutLeaveMainLoop () ; break;
|
||||
|
||||
case 'I':
|
||||
case 'i': show_info=!show_info; break;
|
||||
|
||||
case '=':
|
||||
case '+': slices++; break;
|
||||
|
||||
case '-':
|
||||
case '_': if( slices > -1 ) slices--; break;
|
||||
|
||||
case ',':
|
||||
case '<': if( stacks > -1 ) stacks--; break;
|
||||
|
||||
case '.':
|
||||
case '>': stacks++; break;
|
||||
|
||||
case '9':
|
||||
case '(': if( depth > -1 ) depth--; break;
|
||||
|
||||
case '0':
|
||||
case ')': ++depth; break;
|
||||
|
||||
case 'P':
|
||||
case 'p': persProject=!persProject; break;
|
||||
|
||||
case 'R':
|
||||
case 'r': animateXRot=!animateXRot; break;
|
||||
|
||||
case 'S':
|
||||
case 's':
|
||||
useShader=!useShader;
|
||||
/* Cuboctahedron can't be shown when in shader mode, move to next */
|
||||
if (useShader && NUMBEROF (table)-1 == ( unsigned )function_index)
|
||||
function_index = 0;
|
||||
break;
|
||||
|
||||
case 'F':
|
||||
case 'f':
|
||||
flat ^= 1;
|
||||
break;
|
||||
|
||||
case 'N':
|
||||
case 'n': visNormals=!visNormals; break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
static void special (int key, int x, int y)
|
||||
{
|
||||
switch (key)
|
||||
{
|
||||
case GLUT_KEY_PAGE_UP: ++function_index; break;
|
||||
case GLUT_KEY_PAGE_DOWN: --function_index; break;
|
||||
case GLUT_KEY_UP: orad *= 2; break;
|
||||
case GLUT_KEY_DOWN: orad /= 2; break;
|
||||
|
||||
case GLUT_KEY_RIGHT: irad *= 2; break;
|
||||
case GLUT_KEY_LEFT: irad /= 2; break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (0 > function_index)
|
||||
function_index = NUMBEROF (table) - 1;
|
||||
|
||||
if (NUMBEROF (table) <= ( unsigned )function_index)
|
||||
function_index = 0;
|
||||
|
||||
/* Cuboctahedron can't be shown when in shader mode, skip it */
|
||||
if (useShader && NUMBEROF (table)-1 == ( unsigned )function_index)
|
||||
{
|
||||
if (key==GLUT_KEY_PAGE_UP)
|
||||
function_index = 0;
|
||||
else
|
||||
function_index -= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
idle(void)
|
||||
{
|
||||
glutPostRedisplay();
|
||||
}
|
||||
|
||||
const GLfloat light_ambient[] = { 0.0f, 0.0f, 0.0f, 1.0f };
|
||||
const GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
|
||||
|
||||
const GLfloat mat_ambient[] = { 0.7f, 0.7f, 0.7f, 1.0f };
|
||||
const GLfloat mat_diffuse[] = { 0.8f, 0.8f, 0.8f, 1.0f };
|
||||
const GLfloat mat_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
|
||||
const GLfloat high_shininess[] = { 100.0f };
|
||||
|
||||
/* Program entry point */
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
glutInitWindowSize(800,600);
|
||||
glutInitWindowPosition(40,40);
|
||||
glutInit(&argc, argv);
|
||||
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH | GLUT_MULTISAMPLE);
|
||||
|
||||
glutCreateWindow("FreeGLUT Shapes");
|
||||
|
||||
glutReshapeFunc(resize);
|
||||
glutDisplayFunc(display);
|
||||
glutKeyboardFunc(key);
|
||||
glutSpecialFunc(special);
|
||||
glutIdleFunc(idle);
|
||||
|
||||
glutSetOption ( GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION ) ;
|
||||
|
||||
glClearColor(1,1,1,1);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glCullFace(GL_BACK);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glDepthFunc(GL_LESS);
|
||||
|
||||
glEnable(GL_LIGHT0);
|
||||
glEnable(GL_NORMALIZE);
|
||||
glEnable(GL_COLOR_MATERIAL);
|
||||
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
|
||||
|
||||
glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
|
||||
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
|
||||
glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
||||
glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
|
||||
|
||||
initExtensionEntries();
|
||||
|
||||
glutMainLoop();
|
||||
|
||||
#ifdef _MSC_VER
|
||||
/* DUMP MEMORY LEAK INFORMATION */
|
||||
_CrtDumpMemoryLeaks () ;
|
||||
#endif
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
Before Width: | Height: | Size: 4.1 KiB |
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Graphics.h
|
||||
Icon=CL_Graphics.ico
|
||||
Description=A simple program use Easy Graphics Engine
|
||||
Description[zh_CN]=使用EGE库的简单绘图程序
|
||||
Category=Multimedia
|
||||
Category[zh_CN]=多媒体
|
||||
|
||||
[Unit0]
|
||||
CppName=main.cpp
|
||||
Cpp=CL_Graphics_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=0
|
||||
IsCpp=1
|
||||
linker=-lgraphics -luuid -lmsimg32 -lgdi32 -limm32 -lole32 -loleaut32 -lwinmm -lgdiplus_@@__@@_
|
||||
|
||||
|
|
@ -1,32 +0,0 @@
|
|||
#include <graphics.h>
|
||||
#include <math.h>
|
||||
|
||||
void paintstar(double x, double y, double r, double a)
|
||||
{
|
||||
int pt[10];
|
||||
for (int n = 0; n < 5; ++n)
|
||||
{
|
||||
pt[n*2] = (int)( -cos( PI * 4 / 5 * n + a ) * r + x );
|
||||
pt[n*2+1] = (int)( sin( PI * 4 / 5 * n + a) * r + y );
|
||||
}
|
||||
fillpoly(5, pt);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
initgraph( 640, 480 );
|
||||
setcolor( RGB(0xff, 0xff, 0xff) );
|
||||
setfillcolor( RGB(0, 0, 0xff) );
|
||||
setrendermode(RENDER_MANUAL);
|
||||
|
||||
double r = 0;
|
||||
for ( ; is_run(); delay_fps(60) )
|
||||
{
|
||||
r += 0.02;
|
||||
if (r > PI * 2) r -= PI * 2;
|
||||
|
||||
cleardevice();
|
||||
paintstar(300, 200, 100, r);
|
||||
}
|
||||
return 0;
|
||||
}
|
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Turtle Graphics
|
||||
Name[zh_CN]=海龟作图
|
||||
Icon=CL_Turtle.ico
|
||||
Description=A simple program using Turtle Graphics
|
||||
Description[zh_CN]=简单的海龟作图程序 (https://github.com/royqh1979/raylib-drawing)
|
||||
Category=Multimedia
|
||||
Category[zh_CN]=多媒体
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=CL_Turtle_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
IsCpp=0
|
||||
linker=-lrturtle -lrdrawing -lraylib -lopengl32 -lgdi32 -lwinmm
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
#include <rturtle.h>
|
||||
|
||||
int main() {
|
||||
int n;
|
||||
initWorld(800,600);
|
||||
|
||||
// Press F2 toggle display of grids
|
||||
// Press F3 toggle display of the turtle
|
||||
// Press F5 capture screen
|
||||
|
||||
setSpeed(500);
|
||||
// setRewind(true);
|
||||
// setImmediate(true);
|
||||
setPenSize(1);
|
||||
|
||||
n=50;
|
||||
for (int i=0;i<n;i++) {
|
||||
for (int j=0;j<4;j++) {
|
||||
fd(200);
|
||||
lt(90);
|
||||
}
|
||||
lt(360.0/n);
|
||||
}
|
||||
waitClick();
|
||||
|
||||
return 0;
|
||||
}
|
Before Width: | Height: | Size: 2.9 KiB |
|
@ -1,8 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
return 0;
|
||||
}
|
|
@ -1,7 +0,0 @@
|
|||
#include <iostream>
|
||||
|
||||
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
return 0;
|
||||
}
|
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,34 +0,0 @@
|
|||
/* Replace "dll.h" with the name of your header */
|
||||
#include "dll.h"
|
||||
#include <windows.h>
|
||||
|
||||
DLLIMPORT void HelloWorld()
|
||||
{
|
||||
MessageBox(0,"Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
|
||||
{
|
||||
switch(fdwReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_PROCESS_DETACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_ATTACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_DETACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return TRUE on success, FALSE on failure */
|
||||
return TRUE;
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
/* Replace "dll.h" with the name of your header */
|
||||
#include "dll.h"
|
||||
#include <windows.h>
|
||||
|
||||
DllClass::DllClass()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
DllClass::~DllClass()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DllClass::HelloWorld()
|
||||
{
|
||||
MessageBox(0, "Hello World from DLL!\n","Hi",MB_ICONINFORMATION);
|
||||
}
|
||||
|
||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
|
||||
{
|
||||
switch(fdwReason)
|
||||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_PROCESS_DETACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_ATTACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
case DLL_THREAD_DETACH:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Return TRUE on success, FALSE on failure */
|
||||
return TRUE;
|
||||
}
|
|
@ -1,12 +0,0 @@
|
|||
#ifndef _DLL_H_
|
||||
#define _DLL_H_
|
||||
|
||||
#if BUILDING_DLL
|
||||
#define DLLIMPORT __declspec(dllexport)
|
||||
#else
|
||||
#define DLLIMPORT __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
DLLIMPORT void HelloWorld();
|
||||
|
||||
#endif
|
|
@ -1,18 +0,0 @@
|
|||
#ifndef _DLL_H_
|
||||
#define _DLL_H_
|
||||
|
||||
#if BUILDING_DLL
|
||||
#define DLLIMPORT __declspec(dllexport)
|
||||
#else
|
||||
#define DLLIMPORT __declspec(dllimport)
|
||||
#endif
|
||||
|
||||
class DLLIMPORT DllClass
|
||||
{
|
||||
public:
|
||||
DllClass();
|
||||
virtual ~DllClass();
|
||||
void HelloWorld();
|
||||
};
|
||||
|
||||
#endif
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 766 B |
|
@ -1,31 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=File Editor
|
||||
Name[zh_CN]=文件编辑器
|
||||
Icon=Editor.ico
|
||||
Description=A simple Win32 file editor
|
||||
Description[zh_CN]=一个简单的Win32文件编辑器
|
||||
Category=Win32
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=FileEditor_c.txt
|
||||
Cpp=FileEditor_c.txt
|
||||
|
||||
[Unit1]
|
||||
CName=main.h
|
||||
CppName=main.h
|
||||
C=FileEditor_h.txt
|
||||
Cpp=FileEditor_h.txt
|
||||
|
||||
[Unit2]
|
||||
CName=resource.rc
|
||||
CppName=resource.rc
|
||||
C=FileEditor_rc.txt
|
||||
Cpp=FileEditor_rc.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=3
|
||||
Type=0
|
||||
Icon=Editor.ico
|
|
@ -1,172 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include "main.h"
|
||||
|
||||
BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {
|
||||
HANDLE hFile;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
|
||||
if(hFile != INVALID_HANDLE_VALUE) {
|
||||
DWORD dwFileSize;
|
||||
dwFileSize = GetFileSize(hFile, NULL);
|
||||
if(dwFileSize != 0xFFFFFFFF) {
|
||||
LPSTR pszFileText;
|
||||
pszFileText = (LPSTR)GlobalAlloc(GPTR, dwFileSize + 1);
|
||||
if(pszFileText != NULL) {
|
||||
DWORD dwRead;
|
||||
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) {
|
||||
pszFileText[dwFileSize] = 0; // Null terminator
|
||||
if(SetWindowText(hEdit, pszFileText))
|
||||
bSuccess = TRUE; // It worked!
|
||||
}
|
||||
GlobalFree(pszFileText);
|
||||
}
|
||||
}
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
BOOL SaveFile(HWND hEdit, LPSTR pszFileName) {
|
||||
HANDLE hFile;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if(hFile != INVALID_HANDLE_VALUE) {
|
||||
DWORD dwTextLength;
|
||||
dwTextLength = GetWindowTextLength(hEdit);
|
||||
if(dwTextLength > 0) {
|
||||
LPSTR pszText;
|
||||
pszText = (LPSTR)GlobalAlloc(GPTR, dwTextLength + 1);
|
||||
if(pszText != NULL) {
|
||||
if(GetWindowText(hEdit, pszText, dwTextLength + 1)) {
|
||||
DWORD dwWritten;
|
||||
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
|
||||
bSuccess = TRUE;
|
||||
}
|
||||
GlobalFree(pszText);
|
||||
}
|
||||
}
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
BOOL DoFileOpenSave(HWND hwnd, BOOL bSave) {
|
||||
OPENFILENAME ofn;
|
||||
char szFileName[MAX_PATH];
|
||||
|
||||
ZeroMemory(&ofn, sizeof(ofn));
|
||||
szFileName[0] = 0;
|
||||
|
||||
ofn.lStructSize = sizeof(ofn);
|
||||
ofn.hwndOwner = hwnd;
|
||||
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
|
||||
ofn.lpstrFile = szFileName;
|
||||
ofn.nMaxFile = MAX_PATH;
|
||||
ofn.lpstrDefExt = "txt";
|
||||
|
||||
if(bSave) {
|
||||
ofn.Flags = OFN_EXPLORER|OFN_PATHMUSTEXIST|OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT;
|
||||
if(GetSaveFileName(&ofn)) {
|
||||
if(!SaveFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
|
||||
MessageBox(hwnd, "Save file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
ofn.Flags = OFN_EXPLORER|OFN_FILEMUSTEXIST|OFN_HIDEREADONLY;
|
||||
if(GetOpenFileName(&ofn)) {
|
||||
if(!LoadFile(GetDlgItem(hwnd, IDC_MAIN_TEXT), szFileName)) {
|
||||
MessageBox(hwnd, "Load of file failed.", "Error",MB_OK|MB_ICONEXCLAMATION);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||
switch(Message) {
|
||||
case WM_CREATE:
|
||||
CreateWindow("EDIT", "",WS_CHILD|WS_VISIBLE|WS_HSCROLL|WS_VSCROLL|ES_MULTILINE|ES_WANTRETURN,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,hwnd, (HMENU)IDC_MAIN_TEXT, GetModuleHandle(NULL), NULL);
|
||||
SendDlgItemMessage(hwnd, IDC_MAIN_TEXT, WM_SETFONT,(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE,0));
|
||||
break;
|
||||
case WM_SIZE:
|
||||
if(wParam != SIZE_MINIMIZED)
|
||||
MoveWindow(GetDlgItem(hwnd, IDC_MAIN_TEXT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
|
||||
break;
|
||||
case WM_SETFOCUS:
|
||||
SetFocus(GetDlgItem(hwnd, IDC_MAIN_TEXT));
|
||||
break;
|
||||
case WM_COMMAND:
|
||||
switch(LOWORD(wParam)) {
|
||||
case CM_FILE_OPEN:
|
||||
DoFileOpenSave(hwnd, FALSE);
|
||||
break;
|
||||
case CM_FILE_SAVEAS:
|
||||
DoFileOpenSave(hwnd, TRUE);
|
||||
break;
|
||||
case CM_FILE_EXIT:
|
||||
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||
break;
|
||||
case CM_ABOUT:
|
||||
MessageBox (NULL, "File Editor for Windows!\nCreated using the Win32 API" , "About...", 0);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(hwnd);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow) {
|
||||
WNDCLASSEX wc;
|
||||
HWND hwnd;
|
||||
MSG Msg;
|
||||
|
||||
wc.cbSize = sizeof(WNDCLASSEX);
|
||||
wc.style = 0;
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wc.lpszMenuName = "MAINMENU";
|
||||
wc.lpszClassName = "WindowClass";
|
||||
wc.hIconSm = LoadIcon(hInstance,"A"); /* A is name used by project icons */
|
||||
|
||||
if(!RegisterClassEx(&wc)) {
|
||||
MessageBox(0,"Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","File Editor Example Program",WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
320,240,
|
||||
NULL, NULL, hInstance, NULL);
|
||||
|
||||
if(hwnd == NULL) {
|
||||
MessageBox(0, "Window Creation Failed!", "Error!",MB_ICONEXCLAMATION|MB_OK|MB_SYSTEMMODAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ShowWindow(hwnd,1);
|
||||
UpdateWindow(hwnd);
|
||||
|
||||
while(GetMessage(&Msg, NULL, 0, 0) > 0) {
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
}
|
||||
return Msg.wParam;
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
#define CM_FILE_SAVEAS 9072
|
||||
#define CM_FILE_EXIT 9071
|
||||
#define CM_FILE_OPEN 9070
|
||||
#define CM_ABOUT 9069
|
||||
|
||||
#define IDC_MAIN_TEXT 1001
|
|
@ -1,18 +0,0 @@
|
|||
#include "main.h"
|
||||
|
||||
MAINMENU MENU
|
||||
{
|
||||
POPUP "&File"
|
||||
{
|
||||
MENUITEM "&Open...", CM_FILE_OPEN
|
||||
MENUITEM "Save &As...", CM_FILE_SAVEAS
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xit", CM_FILE_EXIT
|
||||
}
|
||||
|
||||
POPUP "&Help"
|
||||
{
|
||||
MENUITEM "&About", CM_ABOUT
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,39 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=GLFW
|
||||
Description=A simple GLFW program
|
||||
Description[zh_CN]=一个简单的GLFW程序
|
||||
Icon=GLFW.ico
|
||||
Category=3D
|
||||
Category[zh_CN]=3D
|
||||
|
||||
[Unit0]
|
||||
CppName=main.cpp
|
||||
Cpp=GLFW_main.cpp.txt
|
||||
|
||||
[Unit1]
|
||||
CppName=shader.h
|
||||
Cpp=GLFW_shader.h.txt
|
||||
|
||||
[Unit2]
|
||||
CppName=shader.frag
|
||||
Cpp=GLFW_shader.frag.txt
|
||||
|
||||
[Unit3]
|
||||
CppName=shader.vs
|
||||
Cpp=GLFW_shader.vs.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=4
|
||||
Type=1
|
||||
IsCpp=1
|
||||
Compiler=
|
||||
CppCompiler=
|
||||
Linker=-lglfw3 -lglew32 -lopengl32 -lwinmm -lgdi32_@@__@@_
|
||||
CompilerSettings=0000000000110000000001000
|
||||
CompilerSet=1
|
||||
UseUTF8=0
|
||||
StaticLink=1
|
||||
AddCharset=1
|
||||
IncludeVersionInfo=0
|
||||
SupportXPThemes=0
|
|
@ -1,111 +0,0 @@
|
|||
#include <iostream>
|
||||
// GLEW
|
||||
#define GLEW_STATIC
|
||||
#include <GL/glew.h>
|
||||
// GLFW
|
||||
#include <GLFW/glfw3.h>
|
||||
// Other includes
|
||||
#include "shader.h"
|
||||
|
||||
// Function prototypes
|
||||
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode);
|
||||
|
||||
// Window dimensions
|
||||
const GLuint WIDTH = 800, HEIGHT = 600;
|
||||
|
||||
// The MAIN function, from here we start the application and run the game loop
|
||||
int main()
|
||||
{
|
||||
// Init GLFW
|
||||
glfwInit();
|
||||
// Set all the required options for GLFW
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
|
||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||
glfwWindowHint(GLFW_RESIZABLE, GL_FALSE);
|
||||
|
||||
// Create a GLFWwindow object that we can use for GLFW's functions
|
||||
GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr);
|
||||
glfwMakeContextCurrent(window);
|
||||
|
||||
// Set the required callback functions
|
||||
glfwSetKeyCallback(window, key_callback);
|
||||
|
||||
// Set this to true so GLEW knows to use a modern approach to retrieving function pointers and extensions
|
||||
glewExperimental = GL_TRUE;
|
||||
// Initialize GLEW to setup the OpenGL Function pointers
|
||||
glewInit();
|
||||
|
||||
// Define the viewport dimensions
|
||||
glViewport(0, 0, WIDTH, HEIGHT);
|
||||
|
||||
|
||||
//读取shader文件,并编译,见shader.h代码
|
||||
Shader ourShader("shader.vs", "shader.frag");
|
||||
|
||||
|
||||
// 一维数组,每六个代表一个顶点属性,前三个代表位置属性,后三个代表颜色属性
|
||||
GLfloat vertices[] = {
|
||||
// Positions // Colors
|
||||
0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, // Bottom Right
|
||||
-0.5f, -0.5f, 0.0f, 0.0f, 1.0f, 0.0f, // Bottom Left
|
||||
0.0f, 0.5f, 0.0f, 0.0f, 0.0f, 1.0f // Top
|
||||
};
|
||||
GLuint VBO, VAO;//声明顶点缓冲,声明顶点数组用于管理顶点数据
|
||||
glGenVertexArrays(1, &VAO);//创建顶点数组,返回一个独一无二的整数,标识数组
|
||||
glGenBuffers(1, &VBO);//创建顶点缓冲,返回一个独一无二的整数,标识缓冲区
|
||||
|
||||
glBindVertexArray(VAO);//绑定顶点数组
|
||||
glBindBuffer(GL_ARRAY_BUFFER, VBO);//绑定顶点缓冲
|
||||
//指定顶点数组的数据源为vertices,第四个参数代表显卡如何管理给定的数据,GL_STATIC_DRWA代表几乎不会改变
|
||||
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
|
||||
|
||||
// 指定顶点属性的解析方式。即,如何从顶点缓冲获取相应的顶点属性和相应的颜色属性。或者说,顶点着色器中如何知道去哪个顶点属性分量重着色呢
|
||||
//对每一个顶点而言,属性有2种,一是位置属性,而是颜色属性,因此每六个浮点数决定了一个顶点的位置和颜色
|
||||
|
||||
//顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location),因此第一个参数,代表属性分量的索引
|
||||
//参数二:顶点位置属性的维度,参数三:属性向量的数据类型,参数四:是否标准化;参数五,顶点位置属性的总字节长度,参数六:在缓冲数组中的偏移量,即起始位置
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)0);
|
||||
glEnableVertexAttribArray(0);//启用属性0,因为默认是禁用的
|
||||
|
||||
// 参数一,对应顶点着色器中的layout (location = 1) in vec3 color;参数六:说明颜色属性的偏移量在三个浮点数后,与上文vertices一致
|
||||
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (GLvoid*)(3 * sizeof(GLfloat)));
|
||||
glEnableVertexAttribArray(1);//启用属性1.
|
||||
|
||||
//顶点数组对象(Vertex Array Object, VAO)的好处就是,当配置顶点属性指针时,你只需要将上面的代码调用执行一次,之后再绘制物体的时候只需要绑定相应的VAO就行了。如下文循环中的绑定再解绑
|
||||
glBindVertexArray(0); // 解绑 VAO
|
||||
// Game loop
|
||||
while (!glfwWindowShouldClose(window))
|
||||
{
|
||||
// 检查事件,调用相应的回调函数,如下文的key_callback函数
|
||||
glfwPollEvents();
|
||||
|
||||
// Render
|
||||
// Clear the colorbuffer
|
||||
glClearColor(0.2f, 0.3f, 0.3f, 1.0f);//渲染颜色到后台缓冲
|
||||
glClear(GL_COLOR_BUFFER_BIT);//清除前台缓冲
|
||||
|
||||
// Draw the triangle
|
||||
ourShader.Use();//启用着色器程序
|
||||
glBindVertexArray(VAO);//每次循环都调用,绑定函数绑定VAO
|
||||
glDrawArrays(GL_TRIANGLES, 0, 3);
|
||||
glBindVertexArray(0);//解绑
|
||||
|
||||
// Swap the screen buffers
|
||||
glfwSwapBuffers(window);
|
||||
}
|
||||
// Properly de-allocate all resources once they've outlived their purpose
|
||||
glDeleteVertexArrays(1, &VAO);
|
||||
glDeleteBuffers(1, &VBO);
|
||||
// Terminate GLFW, clearing any resources allocated by GLFW.
|
||||
glfwTerminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
// Is called whenever a key is pressed/released via GLFW
|
||||
void key_callback(GLFWwindow* window, int key, int scancode, int action, int mode)
|
||||
{
|
||||
if (key == GLFW_KEY_ESCAPE && action == GLFW_PRESS)
|
||||
glfwSetWindowShouldClose(window, GL_TRUE);
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
#version 330 core
|
||||
in vec3 ourColor;
|
||||
out vec4 color;
|
||||
|
||||
void main()
|
||||
{
|
||||
color = vec4(ourColor, 1.0f);
|
||||
}
|
|
@ -1,98 +0,0 @@
|
|||
#ifndef SHADER_H
|
||||
#define SHADER_H
|
||||
|
||||
#include <string>
|
||||
#include <fstream>
|
||||
#include <sstream>
|
||||
#include <iostream>
|
||||
|
||||
#include <GL/glew.h>
|
||||
|
||||
class Shader
|
||||
{
|
||||
public:
|
||||
GLuint Program;
|
||||
// Constructor generates the shader on the fly
|
||||
Shader(const GLchar* vertexPath, const GLchar* fragmentPath)
|
||||
{
|
||||
// 1. Retrieve the vertex/fragment source code from filePath
|
||||
std::string vertexCode;
|
||||
std::string fragmentCode;
|
||||
std::ifstream vShaderFile;
|
||||
std::ifstream fShaderFile;
|
||||
// ensures ifstream objects can throw exceptions:
|
||||
vShaderFile.exceptions(std::ifstream::badbit);
|
||||
fShaderFile.exceptions(std::ifstream::badbit);
|
||||
try
|
||||
{
|
||||
// Open files
|
||||
vShaderFile.open(vertexPath);
|
||||
fShaderFile.open(fragmentPath);
|
||||
std::stringstream vShaderStream, fShaderStream;
|
||||
// Read file's buffer contents into streams
|
||||
vShaderStream << vShaderFile.rdbuf();
|
||||
fShaderStream << fShaderFile.rdbuf();
|
||||
// close file handlers
|
||||
vShaderFile.close();
|
||||
fShaderFile.close();
|
||||
// Convert stream into string
|
||||
vertexCode = vShaderStream.str();
|
||||
fragmentCode = fShaderStream.str();
|
||||
}
|
||||
catch (std::ifstream::failure e)
|
||||
{
|
||||
std::cout << "ERROR::SHADER::FILE_NOT_SUCCESFULLY_READ" << std::endl;
|
||||
}
|
||||
const GLchar* vShaderCode = vertexCode.c_str();
|
||||
const GLchar * fShaderCode = fragmentCode.c_str();
|
||||
// 2. Compile shaders
|
||||
GLuint vertex, fragment;
|
||||
GLint success;
|
||||
GLchar infoLog[512];
|
||||
// Vertex Shader
|
||||
vertex = glCreateShader(GL_VERTEX_SHADER);//创建顶点着色器
|
||||
glShaderSource(vertex, 1, &vShaderCode, NULL);//指定源代码
|
||||
glCompileShader(vertex);//编译着色器
|
||||
// Print compile errors if any
|
||||
glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);//查看是否编译成功
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(vertex, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
// Fragment Shader
|
||||
fragment = glCreateShader(GL_FRAGMENT_SHADER);//创建片段着色器
|
||||
glShaderSource(fragment, 1, &fShaderCode, NULL);
|
||||
glCompileShader(fragment);
|
||||
// Print compile errors if any
|
||||
glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetShaderInfoLog(fragment, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::FRAGMENT::COMPILATION_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
// Shader Program
|
||||
this->Program = glCreateProgram();//创建着色程序
|
||||
glAttachShader(this->Program, vertex);//关联顶点着色器
|
||||
glAttachShader(this->Program, fragment);//关联片段着色器
|
||||
glLinkProgram(this->Program);//链接编译器
|
||||
// Print linking errors if any
|
||||
glGetProgramiv(this->Program, GL_LINK_STATUS, &success);
|
||||
if (!success)
|
||||
{
|
||||
glGetProgramInfoLog(this->Program, 512, NULL, infoLog);
|
||||
std::cout << "ERROR::SHADER::PROGRAM::LINKING_FAILED\n" << infoLog << std::endl;
|
||||
}
|
||||
// Delete the shaders as they're linked into our program now and no longer necessery
|
||||
glDeleteShader(vertex);
|
||||
glDeleteShader(fragment);
|
||||
|
||||
}
|
||||
// Uses the current shader
|
||||
void Use()
|
||||
{
|
||||
glUseProgram(this->Program);
|
||||
}
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,11 +0,0 @@
|
|||
#version 330 core
|
||||
layout (location = 0) in vec3 position;//in 代表输入向量, location,与下面的顶点属性描述有关。
|
||||
layout (location = 1) in vec3 color;
|
||||
|
||||
out vec3 ourColor;//out 代表输出3维向量,作为片段着色器的输入,见下文
|
||||
|
||||
void main()
|
||||
{
|
||||
gl_Position = vec4(position, 1.0f);
|
||||
ourColor = color;
|
||||
}
|
Before Width: | Height: | Size: 5.9 KiB |
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Hello World
|
||||
Name[zh_CN]=世界,你好!
|
||||
Icon=Communication.ico
|
||||
Description=A classic Hello World program
|
||||
Description[zh_CN]=一个经典的“世界,你好!”程序
|
||||
Category=Console
|
||||
Category[zh_CN]=控制台
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=Hello_c.txt
|
||||
Cpp=Hello_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
Icon=Communication.ico
|
|
@ -1,19 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Input Loop
|
||||
Name[zh_CN]=输入循环
|
||||
Icon=ConsoleToo.ico
|
||||
Description=A console with an input loop
|
||||
Description[zh_CN]=一个带输入循环的控制台程序
|
||||
Category=Console
|
||||
Category[zh_CN]=控制台
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=HelloInput_c.txt
|
||||
Cpp=HelloInput_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
|
@ -1,27 +0,0 @@
|
|||
#include <stdio.h>
|
||||
|
||||
void Foo() {
|
||||
printf("Hello World!\n");
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
char input = 0;
|
||||
|
||||
printf("Hello! This is a console application.\n");
|
||||
printf("Press q to quit, press a to execute foo.\n");
|
||||
while(1) {
|
||||
if(scanf("%c",&input) == 1) {
|
||||
if(input == 'a') {
|
||||
Foo();
|
||||
} else if(input == 'q') {
|
||||
break;
|
||||
} else if(input != '\n') {
|
||||
printf("Unknown command '%c'! Ignoring...\n",input);
|
||||
}
|
||||
} else {
|
||||
printf("Invalid input! Ignoring...\n");
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
#include <iostream>
|
||||
using std::cin;
|
||||
using std::cout;
|
||||
using std::endl;
|
||||
|
||||
void Foo() {
|
||||
cout << "Hello World!" << endl;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
char input = 0;
|
||||
|
||||
cout << "Hello! This is a console application." << endl;
|
||||
cout << "Press q to quit, press a to execute foo." << endl;
|
||||
while(1) {
|
||||
cin >> input;
|
||||
if(input == 'a') {
|
||||
Foo();
|
||||
} else if(input == 'q') {
|
||||
break;
|
||||
} else if(input != '\n') {
|
||||
cout << "Unknown command '" << input << "'! Ignoring...\n";
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,6 +0,0 @@
|
|||
#include <stdio.h>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
printf("Hello world!\n");
|
||||
return 0;
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
#include <iostream>
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
std::cout << "Hello world!\n";
|
||||
}
|
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Jackpot
|
||||
Icon=Games.ico
|
||||
Description=A number guessing game
|
||||
Description[zh_CN]=一个数字猜测游戏
|
||||
Category=Console
|
||||
Category[zh_CN]=控制台
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=Jackpot_c.txt
|
||||
Cpp=Jackpot_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
IsCpp=1
|
||||
Type=1
|
||||
Icon=Games.ico
|
|
@ -1,88 +0,0 @@
|
|||
#include <iostream>
|
||||
#include <stdlib.h>
|
||||
#include <time.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void Start();
|
||||
void GetResults();
|
||||
|
||||
int i, j, life, maxrand;
|
||||
char c;
|
||||
|
||||
void Start() {
|
||||
i = 0;
|
||||
j = 0;
|
||||
life = 0;
|
||||
maxrand = 6;
|
||||
|
||||
cout << "Select difficulty mode:\n"; // the user has to select a difficutly level
|
||||
cout << "1 : Easy (0-15)\n";
|
||||
cout << "2 : Medium (0-30)\n";
|
||||
cout << "3 : Difficult (0-50)\n";
|
||||
cout << "or type another key to quit\n";
|
||||
c = 30;
|
||||
|
||||
cin >> c; // read the user's choice
|
||||
cout << "\n";
|
||||
|
||||
switch (c) {
|
||||
case '1':
|
||||
maxrand = 15; // the random number will be between 0 and maxrand
|
||||
break;
|
||||
case '2':
|
||||
maxrand = 30;
|
||||
break;
|
||||
case '3':
|
||||
maxrand = 50;
|
||||
break;
|
||||
default:
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
|
||||
life = 5; // number of lifes of the player
|
||||
srand((unsigned)time(NULL)); // init Rand() function
|
||||
j = rand() % maxrand; // j get a random value between 0 and maxrand
|
||||
|
||||
GetResults();
|
||||
}
|
||||
|
||||
void GetResults() {
|
||||
if (life <= 0) { // if player has no more life then he loses
|
||||
cout << "You lose !\n\n";
|
||||
Start();
|
||||
}
|
||||
|
||||
cout << "Type a number: \n";
|
||||
cin >> i;
|
||||
|
||||
if((i>maxrand) || (i<0)) { // if the user number isn't correct, restart
|
||||
cout << "Error: number not between 0 and \n" << maxrand;
|
||||
GetResults();
|
||||
}
|
||||
|
||||
if(i == j) {
|
||||
cout << "YOU WIN!\n\n"; // the user found the secret number
|
||||
Start();
|
||||
} else if(i>j) {
|
||||
cout << "Too BIG\n";
|
||||
life = life - 1;
|
||||
cout << "Lives remaining: " << life << "\n\n";
|
||||
GetResults();
|
||||
} else if(i<j) {
|
||||
cout << "Too SMALL\n";
|
||||
life = life - 1;
|
||||
cout << "Lives remaining: " << life << "\n\n";
|
||||
GetResults();
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
cout << "** Jackpot game **\n";
|
||||
cout << "The goal of this game is to guess a number.\n";
|
||||
cout << "Jackpot will tell you if the number is too big or too\n";
|
||||
cout << "small compared to the secret number to find.\n\n";
|
||||
Start();
|
||||
return 0;
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=MDI Editor
|
||||
Name[zh_CN]=MDI编辑器
|
||||
Icon=Windows.ico
|
||||
Description=A Win32 MDI file editor
|
||||
Description[zh_CN]=一个Win32多文档界面(MDI)文件编辑器
|
||||
Category=Win32
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=MDIEditor_c.txt
|
||||
Cpp=MDIEditor_c.txt
|
||||
|
||||
[Unit1]
|
||||
CName=main.h
|
||||
CppName=main.h
|
||||
C=MDIEditor_h.txt
|
||||
Cpp=MDIEditor_h.txt
|
||||
|
||||
[Unit2]
|
||||
CName=resource.rc
|
||||
CppName=resource.rc
|
||||
C=MDIEditor_rc.txt
|
||||
Cpp=MDIEditor_rc.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=3
|
||||
Type=0
|
|
@ -1,433 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
|
||||
#include "main.h"
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam);
|
||||
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam);
|
||||
|
||||
char g_szAppName[] = "MyMDIWindow";
|
||||
char g_szChild[] = "MyMDIChild";
|
||||
HINSTANCE g_hInst;
|
||||
HWND g_hMDIClient, g_hStatusBar, g_hToolBar;
|
||||
HWND g_hMainWindow;
|
||||
|
||||
BOOL LoadFile(HWND hEdit, LPSTR pszFileName) {
|
||||
HANDLE hFile;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
hFile = CreateFile(pszFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
|
||||
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if(hFile != INVALID_HANDLE_VALUE) {
|
||||
DWORD dwFileSize;
|
||||
dwFileSize = GetFileSize(hFile, NULL);
|
||||
if(dwFileSize != 0xFFFFFFFF) {
|
||||
LPSTR pszFileText;
|
||||
pszFileText = (LPSTR)(GlobalAlloc(GPTR, dwFileSize + 1));
|
||||
if(pszFileText != NULL) {
|
||||
DWORD dwRead;
|
||||
if(ReadFile(hFile, pszFileText, dwFileSize, &dwRead, NULL)) {
|
||||
pszFileText[dwFileSize] = 0; // Null terminator
|
||||
if(SetWindowText(hEdit, pszFileText))
|
||||
bSuccess = TRUE; // It worked!
|
||||
}
|
||||
GlobalFree(pszFileText);
|
||||
}
|
||||
}
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
BOOL SaveFile(HWND hEdit, LPSTR pszFileName) {
|
||||
HANDLE hFile;
|
||||
BOOL bSuccess = FALSE;
|
||||
|
||||
hFile = CreateFile(pszFileName, GENERIC_WRITE, 0, NULL,
|
||||
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
|
||||
if(hFile != INVALID_HANDLE_VALUE) {
|
||||
DWORD dwTextLength;
|
||||
dwTextLength = GetWindowTextLength(hEdit);
|
||||
if(dwTextLength > 0) {// No need to bother if there's no text.
|
||||
LPSTR pszText;
|
||||
pszText = (LPSTR)(GlobalAlloc(GPTR, dwTextLength + 1));
|
||||
if(pszText != NULL) {
|
||||
if(GetWindowText(hEdit, pszText, dwTextLength + 1)) {
|
||||
DWORD dwWritten;
|
||||
if(WriteFile(hFile, pszText, dwTextLength, &dwWritten, NULL))
|
||||
bSuccess = TRUE;
|
||||
}
|
||||
GlobalFree(pszText);
|
||||
}
|
||||
}
|
||||
CloseHandle(hFile);
|
||||
}
|
||||
return bSuccess;
|
||||
}
|
||||
|
||||
BOOL GetFileName(HWND hwnd, LPSTR pszFileName, BOOL bSave) {
|
||||
OPENFILENAME ofn;
|
||||
|
||||
ZeroMemory(&ofn, sizeof(ofn));
|
||||
pszFileName[0] = 0;
|
||||
|
||||
ofn.lStructSize = sizeof(ofn);
|
||||
ofn.hwndOwner = hwnd;
|
||||
ofn.lpstrFilter = "Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0\0";
|
||||
ofn.lpstrFile = pszFileName;
|
||||
ofn.nMaxFile = MAX_PATH;
|
||||
ofn.lpstrDefExt = "txt";
|
||||
|
||||
if(bSave) {
|
||||
ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY |
|
||||
OFN_OVERWRITEPROMPT;
|
||||
if(!GetSaveFileName(&ofn))
|
||||
return FALSE;
|
||||
} else {
|
||||
ofn.Flags = OFN_EXPLORER | OFN_FILEMUSTEXIST | OFN_HIDEREADONLY;
|
||||
if(!GetOpenFileName(&ofn))
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpszCmdParam, int nCmdShow) {
|
||||
MSG Msg;
|
||||
WNDCLASSEX WndClassEx;
|
||||
|
||||
g_hInst = hInstance;
|
||||
|
||||
WndClassEx.cbSize = sizeof(WNDCLASSEX);
|
||||
WndClassEx.style = CS_HREDRAW | CS_VREDRAW;
|
||||
WndClassEx.lpfnWndProc = WndProc;
|
||||
WndClassEx.cbClsExtra = 0;
|
||||
WndClassEx.cbWndExtra = 0;
|
||||
WndClassEx.hInstance = hInstance;
|
||||
WndClassEx.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
WndClassEx.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
WndClassEx.hbrBackground = (HBRUSH)(COLOR_3DSHADOW+1);
|
||||
WndClassEx.lpszMenuName = "MAIN";
|
||||
WndClassEx.lpszClassName = g_szAppName;
|
||||
WndClassEx.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||
|
||||
if(!RegisterClassEx(&WndClassEx)) {
|
||||
MessageBox(0, "Could Not Register Window", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
|
||||
return -1;
|
||||
}
|
||||
|
||||
WndClassEx.lpfnWndProc = MDIChildWndProc;
|
||||
WndClassEx.lpszMenuName = NULL;
|
||||
WndClassEx.lpszClassName = g_szChild;
|
||||
WndClassEx.hbrBackground = (HBRUSH)(COLOR_3DFACE+1);
|
||||
|
||||
if(!RegisterClassEx(&WndClassEx)) {
|
||||
MessageBox(0, "Could Not Register Child Window", "Oh Oh...",
|
||||
MB_ICONEXCLAMATION | MB_OK);
|
||||
return -1;
|
||||
}
|
||||
|
||||
g_hMainWindow = CreateWindowEx(WS_EX_APPWINDOW,g_szAppName,"MDI File Editor",WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
CW_USEDEFAULT,
|
||||
0, 0, hInstance, NULL);
|
||||
|
||||
if (g_hMainWindow == NULL){
|
||||
MessageBox(0, "No Window", "Oh Oh...", MB_ICONEXCLAMATION | MB_OK);
|
||||
return -1;
|
||||
}
|
||||
|
||||
ShowWindow(g_hMainWindow, nCmdShow);
|
||||
UpdateWindow(g_hMainWindow);
|
||||
|
||||
while(GetMessage(&Msg, NULL, 0, 0)) {
|
||||
if (!TranslateMDISysAccel(g_hMDIClient, &Msg)) {
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
}
|
||||
}
|
||||
return Msg.wParam;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||
switch(Message) {
|
||||
case WM_CREATE: {
|
||||
CLIENTCREATESTRUCT ccs;
|
||||
int iStatusWidths[] = {200, 300, -1};
|
||||
TBADDBITMAP tbab;
|
||||
TBBUTTON tbb[9];
|
||||
|
||||
// Find window menu where children will be listed
|
||||
ccs.hWindowMenu = GetSubMenu(GetMenu(hwnd), 2);
|
||||
ccs.idFirstChild = ID_MDI_FIRSTCHILD;
|
||||
g_hMDIClient = CreateWindowEx(WS_EX_CLIENTEDGE, "mdiclient", NULL,
|
||||
WS_CHILD | WS_CLIPCHILDREN | WS_VSCROLL | WS_HSCROLL,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
hwnd, (HMENU)ID_MDI_CLIENT, g_hInst, (LPVOID)&ccs);
|
||||
ShowWindow(g_hMDIClient, SW_SHOW);
|
||||
|
||||
g_hStatusBar = CreateWindowEx(0, STATUSCLASSNAME, NULL,
|
||||
WS_CHILD | WS_VISIBLE | SBARS_SIZEGRIP, 0, 0, 0, 0,
|
||||
hwnd, (HMENU)ID_STATUSBAR, g_hInst, NULL);
|
||||
SendMessage(g_hStatusBar, SB_SETPARTS, 3, (LPARAM)iStatusWidths);
|
||||
SendMessage(g_hStatusBar, SB_SETTEXT, 2, (LPARAM)"Toolbar & Statusbar Example");
|
||||
|
||||
g_hToolBar = CreateWindowEx(0, TOOLBARCLASSNAME, NULL,
|
||||
WS_CHILD | WS_VISIBLE, 0, 0, 0, 0,
|
||||
hwnd, (HMENU)ID_TOOLBAR, g_hInst, NULL);
|
||||
|
||||
// Send the TB_BUTTONSTRUCTSIZE message, which is required for
|
||||
// backward compatibility.
|
||||
SendMessage(g_hToolBar, TB_BUTTONSTRUCTSIZE, (WPARAM)sizeof(TBBUTTON), 0);
|
||||
|
||||
tbab.hInst = HINST_COMMCTRL;
|
||||
tbab.nID = IDB_STD_SMALL_COLOR;
|
||||
SendMessage(g_hToolBar, TB_ADDBITMAP, 0, (LPARAM)&tbab);
|
||||
|
||||
ZeroMemory(tbb, sizeof(tbb));
|
||||
|
||||
tbb[0].iBitmap = STD_FILENEW;
|
||||
tbb[0].fsState = TBSTATE_ENABLED;
|
||||
tbb[0].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[0].idCommand = CM_FILE_NEW;
|
||||
|
||||
tbb[1].iBitmap = STD_FILEOPEN;
|
||||
tbb[1].fsState = TBSTATE_ENABLED;
|
||||
tbb[1].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[1].idCommand = CM_FILE_OPEN;
|
||||
|
||||
tbb[2].iBitmap = STD_FILESAVE;
|
||||
tbb[2].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[2].idCommand = CM_FILE_SAVE;
|
||||
|
||||
tbb[3].fsStyle = TBSTYLE_SEP;
|
||||
|
||||
tbb[4].iBitmap = STD_CUT;
|
||||
tbb[4].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[4].idCommand = CM_EDIT_CUT;
|
||||
|
||||
tbb[5].iBitmap = STD_COPY;
|
||||
tbb[5].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[5].idCommand = CM_EDIT_COPY;
|
||||
|
||||
tbb[6].iBitmap = STD_PASTE;
|
||||
tbb[6].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[6].idCommand = CM_EDIT_PASTE;
|
||||
|
||||
tbb[7].fsStyle = TBSTYLE_SEP;
|
||||
|
||||
tbb[8].iBitmap = STD_UNDO;
|
||||
tbb[8].fsStyle = TBSTYLE_BUTTON;
|
||||
tbb[8].idCommand = CM_EDIT_UNDO;
|
||||
|
||||
SendMessage(g_hToolBar, TB_ADDBUTTONS, 9, (LPARAM)&tbb);
|
||||
return 0;
|
||||
}
|
||||
case WM_COMMAND: {
|
||||
switch(LOWORD(wParam)) {
|
||||
case CM_FILE_EXIT:
|
||||
PostMessage(hwnd, WM_CLOSE, 0, 0);
|
||||
break;
|
||||
case CM_FILE_NEW: {
|
||||
MDICREATESTRUCT mcs;
|
||||
HWND hChild;
|
||||
|
||||
mcs.szTitle = "[Untitled]";
|
||||
mcs.szClass = g_szChild;
|
||||
mcs.hOwner = g_hInst;
|
||||
mcs.x = mcs.cx = CW_USEDEFAULT;
|
||||
mcs.y = mcs.cy = CW_USEDEFAULT;
|
||||
mcs.style = MDIS_ALLCHILDSTYLES;
|
||||
|
||||
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE,0, (LPARAM)&mcs);
|
||||
if(!hChild) {
|
||||
MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",MB_ICONEXCLAMATION | MB_OK);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CM_FILE_OPEN: {
|
||||
MDICREATESTRUCT mcs;
|
||||
HWND hChild;
|
||||
char szFileName[MAX_PATH];
|
||||
|
||||
if(!GetFileName(hwnd, szFileName, FALSE))
|
||||
break;
|
||||
|
||||
mcs.szTitle = szFileName;
|
||||
mcs.szClass = g_szChild;
|
||||
mcs.hOwner = g_hInst;
|
||||
mcs.x = mcs.cx = CW_USEDEFAULT;
|
||||
mcs.y = mcs.cy = CW_USEDEFAULT;
|
||||
mcs.style = MDIS_ALLCHILDSTYLES;
|
||||
|
||||
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDICREATE, 0, (LPARAM)&mcs);
|
||||
|
||||
if(!hChild) {
|
||||
MessageBox(hwnd, "MDI Child creation failed.", "Oh Oh...",
|
||||
MB_ICONEXCLAMATION | MB_OK);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case CM_WINDOW_TILEHORZ:
|
||||
PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_HORIZONTAL, 0);
|
||||
break;
|
||||
case CM_WINDOW_TILEVERT:
|
||||
PostMessage(g_hMDIClient, WM_MDITILE, MDITILE_VERTICAL, 0);
|
||||
break;
|
||||
case CM_WINDOW_CASCADE:
|
||||
PostMessage(g_hMDIClient, WM_MDICASCADE, 0, 0);
|
||||
break;
|
||||
case CM_WINDOW_ARRANGE:
|
||||
PostMessage(g_hMDIClient, WM_MDIICONARRANGE, 0, 0);
|
||||
break;
|
||||
default: {
|
||||
if(LOWORD(wParam) >= ID_MDI_FIRSTCHILD){
|
||||
DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
|
||||
} else {
|
||||
HWND hChild;
|
||||
hChild = (HWND)SendMessage(g_hMDIClient, WM_MDIGETACTIVE,0,0);
|
||||
if(hChild){
|
||||
SendMessage(hChild, WM_COMMAND, wParam, lParam);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_SIZE: {
|
||||
RECT rectClient, rectStatus, rectTool;
|
||||
UINT uToolHeight, uStatusHeight, uClientAlreaHeight;
|
||||
|
||||
SendMessage(g_hToolBar, TB_AUTOSIZE, 0, 0);
|
||||
SendMessage(g_hStatusBar, WM_SIZE, 0, 0);
|
||||
|
||||
GetClientRect(hwnd, &rectClient);
|
||||
GetWindowRect(g_hStatusBar, &rectStatus);
|
||||
GetWindowRect(g_hToolBar, &rectTool);
|
||||
|
||||
uToolHeight = rectTool.bottom - rectTool.top;
|
||||
uStatusHeight = rectStatus.bottom - rectStatus.top;
|
||||
uClientAlreaHeight = rectClient.bottom;
|
||||
|
||||
MoveWindow(g_hMDIClient, 0, uToolHeight, rectClient.right, uClientAlreaHeight - uStatusHeight - uToolHeight, TRUE);
|
||||
break;
|
||||
}
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(hwnd);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefFrameProc(hwnd, g_hMDIClient, Message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
LRESULT CALLBACK MDIChildWndProc(HWND hwnd, UINT Message, WPARAM wParam,LPARAM lParam) {
|
||||
switch(Message) {
|
||||
case WM_CREATE: {
|
||||
char szFileName[MAX_PATH];
|
||||
HWND hEdit;
|
||||
|
||||
hEdit = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL | ES_MULTILINE | ES_WANTRETURN,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
|
||||
hwnd, (HMENU)IDC_CHILD_EDIT, g_hInst, NULL);
|
||||
|
||||
SendMessage(hEdit, WM_SETFONT,
|
||||
(WPARAM)GetStockObject(DEFAULT_GUI_FONT), MAKELPARAM(TRUE, 0));
|
||||
|
||||
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||
if(*szFileName != '[') {
|
||||
if(!LoadFile(hEdit, szFileName)) {
|
||||
MessageBox(hwnd, "Couldn't Load File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||
return -1; //cancel window creation
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case WM_SIZE:
|
||||
if(wParam != SIZE_MINIMIZED)
|
||||
MoveWindow(GetDlgItem(hwnd, IDC_CHILD_EDIT), 0, 0, LOWORD(lParam),HIWORD(lParam), TRUE);
|
||||
break;
|
||||
case WM_MDIACTIVATE: {
|
||||
HMENU hMenu, hFileMenu;
|
||||
BOOL EnableFlag;
|
||||
char szFileName[MAX_PATH];
|
||||
|
||||
hMenu = GetMenu(g_hMainWindow);
|
||||
if(hwnd == (HWND)lParam){ //being activated
|
||||
EnableFlag = TRUE;
|
||||
} else{
|
||||
EnableFlag = FALSE; //being de-activated
|
||||
}
|
||||
EnableMenuItem(hMenu, 1, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||
EnableMenuItem(hMenu, 2, MF_BYPOSITION | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||
|
||||
hFileMenu = GetSubMenu(hMenu, 0);
|
||||
EnableMenuItem(hFileMenu, CM_FILE_SAVE, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||
EnableMenuItem(hFileMenu, CM_FILE_SAVEAS, MF_BYCOMMAND | (EnableFlag ? MF_ENABLED : MF_GRAYED));
|
||||
|
||||
DrawMenuBar(g_hMainWindow);
|
||||
|
||||
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_FILE_SAVE, MAKELONG(EnableFlag, 0));
|
||||
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_UNDO, MAKELONG(EnableFlag, 0));
|
||||
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_CUT, MAKELONG(EnableFlag, 0));
|
||||
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_COPY, MAKELONG(EnableFlag, 0));
|
||||
SendMessage(g_hToolBar, TB_ENABLEBUTTON, CM_EDIT_PASTE, MAKELONG(EnableFlag, 0));
|
||||
|
||||
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||
SendMessage(g_hStatusBar, SB_SETTEXT, 0, (LPARAM)(EnableFlag ? szFileName : ""));
|
||||
break;
|
||||
}
|
||||
case WM_SETFOCUS:
|
||||
SetFocus(GetDlgItem(hwnd, IDC_CHILD_EDIT));
|
||||
break;
|
||||
case WM_COMMAND: {
|
||||
switch(LOWORD(wParam)) {
|
||||
case CM_FILE_SAVE: {
|
||||
char szFileName[MAX_PATH];
|
||||
|
||||
GetWindowText(hwnd, szFileName, MAX_PATH);
|
||||
if(*szFileName != '[') {
|
||||
if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
|
||||
MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||
return 0;
|
||||
}
|
||||
} else {
|
||||
PostMessage(hwnd, WM_COMMAND,MAKEWPARAM(CM_FILE_SAVEAS, 0), 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case CM_FILE_SAVEAS: {
|
||||
char szFileName[MAX_PATH];
|
||||
|
||||
if(GetFileName(hwnd, szFileName, TRUE)) {
|
||||
if(!SaveFile(GetDlgItem(hwnd, IDC_CHILD_EDIT), szFileName)) {
|
||||
MessageBox(hwnd, "Couldn't Save File.", "Error.",MB_OK | MB_ICONEXCLAMATION);
|
||||
return 0;
|
||||
} else {
|
||||
SetWindowText(hwnd, szFileName);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
case CM_EDIT_UNDO:
|
||||
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, EM_UNDO, 0, 0);
|
||||
break;
|
||||
case CM_EDIT_CUT:
|
||||
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_CUT, 0, 0);
|
||||
break;
|
||||
case CM_EDIT_COPY:
|
||||
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_COPY, 0, 0);
|
||||
break;
|
||||
case CM_EDIT_PASTE:
|
||||
SendDlgItemMessage(hwnd, IDC_CHILD_EDIT, WM_PASTE, 0, 0);
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return DefMDIChildProc(hwnd, Message, wParam, lParam);
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
#define CM_WINDOW_TILEVERT 9080
|
||||
#define CM_WINDOW_TILEHORZ 9082
|
||||
#define CM_WINDOW_ARRANGE 9081
|
||||
#define CM_WINDOW_TILE 9080
|
||||
#define CM_WINDOW_CASCADE 9076
|
||||
#define CM_EDIT_PASTE 9079
|
||||
#define CM_EDIT_COPY 9078
|
||||
#define CM_EDIT_CUT 9077
|
||||
#define CM_EDIT_REDO 9076
|
||||
#define CM_EDIT_UNDO 9075
|
||||
#define CM_FILE_SAVEAS 9074
|
||||
#define CM_FILE_SAVE 9073
|
||||
#define CM_FILE_OPEN 9072
|
||||
#define CM_HELP_ABOUT 9072
|
||||
#define CM_FILE_EXIT 9071
|
||||
#define CM_FILE_NEW 9070
|
||||
|
||||
#define ID_STATUSBAR 4997
|
||||
#define ID_TOOLBAR 4998
|
||||
|
||||
#define ID_MDI_CLIENT 4999
|
||||
#define ID_MDI_FIRSTCHILD 50000
|
||||
|
||||
#define IDC_CHILD_EDIT 2000
|
|
@ -1,31 +0,0 @@
|
|||
#include "main.h"
|
||||
|
||||
MAIN MENU
|
||||
{
|
||||
POPUP "&File"
|
||||
{
|
||||
MENUITEM "&New", CM_FILE_NEW
|
||||
MENUITEM "&Open...", CM_FILE_OPEN
|
||||
MENUITEM "&Save", CM_FILE_SAVE, GRAYED
|
||||
MENUITEM "Save &As...", CM_FILE_SAVEAS, GRAYED
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "E&xit", CM_FILE_EXIT
|
||||
}
|
||||
|
||||
POPUP "&Edit", GRAYED
|
||||
{
|
||||
MENUITEM "&Undo\tCtrl+Z", CM_EDIT_UNDO
|
||||
MENUITEM SEPARATOR
|
||||
MENUITEM "Cu&t\tCtrl+X", CM_EDIT_CUT
|
||||
MENUITEM "&Copy\tCtrl+C", CM_EDIT_COPY
|
||||
MENUITEM "&Paste\tCtrl+V", CM_EDIT_PASTE
|
||||
}
|
||||
|
||||
POPUP "&Window", GRAYED
|
||||
{
|
||||
MENUITEM "&Cascade", CM_WINDOW_CASCADE
|
||||
MENUITEM "Tile &Horizontal", CM_WINDOW_TILEHORZ
|
||||
MENUITEM "Tile &Vertical", CM_WINDOW_TILEVERT
|
||||
MENUITEM "Arrange &Icons", CM_WINDOW_ARRANGE
|
||||
}
|
||||
}
|
|
@ -1,19 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=OpenGL
|
||||
Icon=Pizza.ico
|
||||
Description=A basic OpenGL program
|
||||
Description[zh_CN]=一个基本的OpenGL程序
|
||||
Category=3D
|
||||
Category[zh_CN]=3D
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=OpenGL.txt
|
||||
Cpp=OpenGL.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=0
|
||||
Linker=-lopengl32
|
|
@ -1,190 +0,0 @@
|
|||
/**************************
|
||||
* Includes
|
||||
*
|
||||
**************************/
|
||||
|
||||
#include <windows.h>
|
||||
#include <gl/gl.h>
|
||||
|
||||
|
||||
/**************************
|
||||
* Function Declarations
|
||||
*
|
||||
**************************/
|
||||
|
||||
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
|
||||
WPARAM wParam, LPARAM lParam);
|
||||
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC);
|
||||
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC);
|
||||
|
||||
|
||||
/**************************
|
||||
* WinMain
|
||||
*
|
||||
**************************/
|
||||
|
||||
int WINAPI WinMain (HINSTANCE hInstance,
|
||||
HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine,
|
||||
int iCmdShow)
|
||||
{
|
||||
WNDCLASS wc;
|
||||
HWND hWnd;
|
||||
HDC hDC;
|
||||
HGLRC hRC;
|
||||
MSG msg;
|
||||
BOOL bQuit = FALSE;
|
||||
float theta = 0.0f;
|
||||
|
||||
/* register window class */
|
||||
wc.style = CS_OWNDC;
|
||||
wc.lpfnWndProc = WndProc;
|
||||
wc.cbClsExtra = 0;
|
||||
wc.cbWndExtra = 0;
|
||||
wc.hInstance = hInstance;
|
||||
wc.hIcon = LoadIcon (NULL, IDI_APPLICATION);
|
||||
wc.hCursor = LoadCursor (NULL, IDC_ARROW);
|
||||
wc.hbrBackground = (HBRUSH) GetStockObject (BLACK_BRUSH);
|
||||
wc.lpszMenuName = NULL;
|
||||
wc.lpszClassName = "GLSample";
|
||||
RegisterClass (&wc);
|
||||
|
||||
/* create main window */
|
||||
hWnd = CreateWindow (
|
||||
"GLSample", "OpenGL Sample",
|
||||
WS_CAPTION | WS_POPUPWINDOW | WS_VISIBLE,
|
||||
0, 0, 256, 256,
|
||||
NULL, NULL, hInstance, NULL);
|
||||
|
||||
/* enable OpenGL for the window */
|
||||
EnableOpenGL (hWnd, &hDC, &hRC);
|
||||
|
||||
/* program main loop */
|
||||
while (!bQuit)
|
||||
{
|
||||
/* check for messages */
|
||||
if (PeekMessage (&msg, NULL, 0, 0, PM_REMOVE))
|
||||
{
|
||||
/* handle or dispatch messages */
|
||||
if (msg.message == WM_QUIT)
|
||||
{
|
||||
bQuit = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
TranslateMessage (&msg);
|
||||
DispatchMessage (&msg);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* OpenGL animation code goes here */
|
||||
|
||||
glClearColor (0.0f, 0.0f, 0.0f, 0.0f);
|
||||
glClear (GL_COLOR_BUFFER_BIT);
|
||||
|
||||
glPushMatrix ();
|
||||
glRotatef (theta, 0.0f, 0.0f, 1.0f);
|
||||
glBegin (GL_TRIANGLES);
|
||||
glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (0.0f, 1.0f);
|
||||
glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.87f, -0.5f);
|
||||
glColor3f (0.0f, 0.0f, 1.0f); glVertex2f (-0.87f, -0.5f);
|
||||
glEnd ();
|
||||
glPopMatrix ();
|
||||
|
||||
SwapBuffers (hDC);
|
||||
|
||||
theta += 1.0f;
|
||||
Sleep (1);
|
||||
}
|
||||
}
|
||||
|
||||
/* shutdown OpenGL */
|
||||
DisableOpenGL (hWnd, hDC, hRC);
|
||||
|
||||
/* destroy the window explicitly */
|
||||
DestroyWindow (hWnd);
|
||||
|
||||
return msg.wParam;
|
||||
}
|
||||
|
||||
|
||||
/********************
|
||||
* Window Procedure
|
||||
*
|
||||
********************/
|
||||
|
||||
LRESULT CALLBACK WndProc (HWND hWnd, UINT message,
|
||||
WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
|
||||
switch (message)
|
||||
{
|
||||
case WM_CREATE:
|
||||
return 0;
|
||||
case WM_CLOSE:
|
||||
PostQuitMessage (0);
|
||||
return 0;
|
||||
|
||||
case WM_DESTROY:
|
||||
return 0;
|
||||
|
||||
case WM_KEYDOWN:
|
||||
switch (wParam)
|
||||
{
|
||||
case VK_ESCAPE:
|
||||
PostQuitMessage(0);
|
||||
return 0;
|
||||
}
|
||||
return 0;
|
||||
|
||||
default:
|
||||
return DefWindowProc (hWnd, message, wParam, lParam);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************
|
||||
* Enable OpenGL
|
||||
*
|
||||
*******************/
|
||||
|
||||
void EnableOpenGL (HWND hWnd, HDC *hDC, HGLRC *hRC)
|
||||
{
|
||||
PIXELFORMATDESCRIPTOR pfd;
|
||||
int iFormat;
|
||||
|
||||
/* get the device context (DC) */
|
||||
*hDC = GetDC (hWnd);
|
||||
|
||||
/* set the pixel format for the DC */
|
||||
ZeroMemory (&pfd, sizeof (pfd));
|
||||
pfd.nSize = sizeof (pfd);
|
||||
pfd.nVersion = 1;
|
||||
pfd.dwFlags = PFD_DRAW_TO_WINDOW |
|
||||
PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER;
|
||||
pfd.iPixelType = PFD_TYPE_RGBA;
|
||||
pfd.cColorBits = 24;
|
||||
pfd.cDepthBits = 16;
|
||||
pfd.iLayerType = PFD_MAIN_PLANE;
|
||||
iFormat = ChoosePixelFormat (*hDC, &pfd);
|
||||
SetPixelFormat (*hDC, iFormat, &pfd);
|
||||
|
||||
/* create and enable the render context (RC) */
|
||||
*hRC = wglCreateContext( *hDC );
|
||||
wglMakeCurrent( *hDC, *hRC );
|
||||
|
||||
}
|
||||
|
||||
|
||||
/******************
|
||||
* Disable OpenGL
|
||||
*
|
||||
******************/
|
||||
|
||||
void DisableOpenGL (HWND hWnd, HDC hDC, HGLRC hRC)
|
||||
{
|
||||
wglMakeCurrent (NULL, NULL);
|
||||
wglDeleteContext (hRC);
|
||||
ReleaseDC (hWnd, hDC);
|
||||
}
|
|
@ -1,21 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=OpenMP
|
||||
Icon=File Management.ico
|
||||
Description=A OpenMP multithreading example
|
||||
Description[zh_CN]=一个OpenMP多线程示例
|
||||
Category=Console
|
||||
Category[zh_CN]=控制台
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=OpenMP_c.txt
|
||||
Cpp=OpenMP_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
Compiler=-fopenmp
|
||||
CppCompiler=-fopenmp
|
||||
Linker=-lgomp
|
|
@ -1,17 +0,0 @@
|
|||
#include <omp.h>
|
||||
#include <stdio.h>
|
||||
|
||||
int main() {
|
||||
|
||||
int i;
|
||||
|
||||
#pragma omp parallel num_threads(2)
|
||||
printf("Hi, I'm thread number %d!\n",omp_get_thread_num());
|
||||
|
||||
#pragma omp parallel for num_threads(2)
|
||||
for(i = 0;i < 20;i++) {
|
||||
printf("\nThread number %d, executing iteration %d...",omp_get_thread_num(),i);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
#include <omp.h>
|
||||
#include <stdio.h>
|
||||
|
||||
// not using iostream here due to output ordering issues
|
||||
|
||||
// iostream tends to output each part between <<'s separately to the console,
|
||||
// which can lead to random output if multiple threads are doing the same
|
||||
// thing.
|
||||
|
||||
// printf will generally output the whole result string in one go, so results
|
||||
// of separate printf calls, even from different threads, will remain intact
|
||||
|
||||
// Another fix, other than using printf, would be to give each thread its own
|
||||
// place to store output temporarily (a stringstream), and then output the whole
|
||||
// result in one go.
|
||||
|
||||
int main() {
|
||||
|
||||
#pragma omp parallel num_threads(2)
|
||||
printf("Hi, I'm thread number %d!\n",omp_get_thread_num());
|
||||
|
||||
#pragma omp parallel for num_threads(2)
|
||||
for(int i = 0;i < 20;i++) {
|
||||
printf("\nThread number %d, executing iteration %d...",omp_get_thread_num(),i);
|
||||
}
|
||||
}
|
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 766 B |
Before Width: | Height: | Size: 766 B |
|
@ -1,33 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Single Dialog Application
|
||||
Name[zh_CN]=单对话框程序
|
||||
Icon=Single Dialog Application.ico
|
||||
Description=An Appliction use a dialog as the main UI
|
||||
Description[zh_CN]=使用一个对话框作为主用户界面简单程序
|
||||
Category=Win32
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=Single_Dialog_Application_main.c.txt
|
||||
|
||||
[Unit1]
|
||||
CName=resource.rc
|
||||
C=Single_Dialog_Application_resource.rc.txt
|
||||
|
||||
[Unit2]
|
||||
CName=resource.h
|
||||
C=Single_Dialog_Application_resource.h.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=3
|
||||
Type=0
|
||||
IsCpp=0
|
||||
Compiler=
|
||||
CppCompiler=
|
||||
Linker=
|
||||
CompilerSettings=0000000000000000000000000
|
||||
CompilerSet=0
|
||||
IncludeVersionInfo=0
|
||||
SupportXPThemes=0
|
||||
Icon=Single Dialog Application.project.ico
|
|
@ -1,42 +0,0 @@
|
|||
#include <windows.h>
|
||||
#include "resource.h"
|
||||
|
||||
HINSTANCE hInst;
|
||||
|
||||
LRESULT MainDlgProc(HWND hDlg, UINT Msg, WPARAM wParam, LPARAM lParam);
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {
|
||||
MSG msg;
|
||||
HWND hMainDlg = NULL;
|
||||
|
||||
hInst = hInstance;
|
||||
hMainDlg = CreateDialog(hInstance, (LPCTSTR)IDD_MAIN_DIALOG, 0,(DLGPROC)MainDlgProc);
|
||||
ShowWindow(hMainDlg, nCmdShow);
|
||||
while (GetMessage(&msg, NULL, 0, 0)) {
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
LRESULT MainDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
|
||||
switch (message) {
|
||||
case WM_INITDIALOG :
|
||||
return TRUE ;
|
||||
case WM_COMMAND :
|
||||
switch (LOWORD (wParam)) {
|
||||
case IDOK :
|
||||
case IDCANCEL :
|
||||
DestroyWindow(hDlg);
|
||||
return TRUE ;
|
||||
}
|
||||
break ;
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(hDlg);
|
||||
return TRUE;
|
||||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
return TRUE;
|
||||
};
|
||||
return FALSE;//返回FALSE给缺省对话框函数DefDlgProc(),表示没有处理本消息
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
#ifndef IDC_STATIC
|
||||
#define IDC_STATIC (-1)
|
||||
#endif
|
||||
|
||||
#define IDD_MAIN_DIALOG 101
|
|
@ -1,24 +0,0 @@
|
|||
// Generated by ResEdit 1.6.5
|
||||
// Copyright (C) 2006-2015
|
||||
// http://www.resedit.net
|
||||
|
||||
#include <windows.h>
|
||||
#include <commctrl.h>
|
||||
#include <richedit.h>
|
||||
#include "resource.h"
|
||||
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Dialog resources
|
||||
//
|
||||
LANGUAGE 0, SUBLANG_NEUTRAL
|
||||
IDD_MAIN_DIALOG DIALOG 0, 0, 186, 95
|
||||
STYLE DS_3DLOOK | DS_CENTER | DS_MODALFRAME | DS_SHELLFONT | WS_CAPTION | WS_VISIBLE | WS_POPUP | WS_SYSMENU
|
||||
CAPTION "Dialog"
|
||||
FONT 8, "Ms Shell Dlg"
|
||||
{
|
||||
PUSHBUTTON "Cancel", IDCANCEL, 129, 24, 50, 14, 0, WS_EX_LEFT
|
||||
DEFPUSHBUTTON "OK", IDOK, 129, 7, 50, 14, 0, WS_EX_LEFT
|
||||
}
|
Before Width: | Height: | Size: 10 KiB |
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,21 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=std::thread
|
||||
Icon=Software.ico
|
||||
Description=A C++ multithreading example
|
||||
Description[zh_CN]=一个C++多线程示例
|
||||
Category=Console
|
||||
Category[zh_CN]=控制台
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=StdThread_c.txt
|
||||
Cpp=StdThread_cpp.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
Compiler=
|
||||
CppCompiler=-std=gnu++11
|
||||
Linker=
|
|
@ -1,2 +0,0 @@
|
|||
// Please note that MinGW32 compilers currently do not support <thread>. Use MinGW64 builds like TDM-GCC instead.
|
||||
// C does not support this magic ;)
|
|
@ -1,43 +0,0 @@
|
|||
// Please note that MinGW32 compilers currently do not support <thread>. Use MinGW64 builds like TDM-GCC instead.
|
||||
|
||||
#include <thread>
|
||||
using std::thread;
|
||||
#include <vector>
|
||||
using std::vector;
|
||||
#include <stdio.h>
|
||||
|
||||
struct ThreadItem {
|
||||
char* result; // could've used stringstream too, but don't like their syntax
|
||||
thread worker;
|
||||
};
|
||||
|
||||
void* ThreadFunction(char** result) {
|
||||
*result = new char[256];
|
||||
snprintf(*result,256,"Hello World from thread ID %d",
|
||||
std::this_thread::get_id());
|
||||
}
|
||||
|
||||
int main() {
|
||||
// Get the amount of "processing units"
|
||||
int n = std::thread::hardware_concurrency();
|
||||
|
||||
// Create array of threads
|
||||
vector<ThreadItem> threadlist;
|
||||
threadlist.resize(n);
|
||||
|
||||
// Spawn a thread for each core
|
||||
for(int i = 0;i < n;i++) {
|
||||
threadlist[i].worker = thread(ThreadFunction,&threadlist[i].result); // pass rand() as data argument
|
||||
}
|
||||
|
||||
// Wait for them all to finish
|
||||
for(int i = 0;i < n;i++) {
|
||||
threadlist[i].worker.join();
|
||||
}
|
||||
|
||||
// Present their calculation results
|
||||
printf("Results:\n");
|
||||
for(int i = 0;i < n;i++) {
|
||||
printf("%s\n",threadlist[i].result);
|
||||
}
|
||||
}
|
|
@ -1,24 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Animation Example
|
||||
Name[zh_CN]=动画示例
|
||||
Icon=Windows.ico
|
||||
Description=A Win32 painting example
|
||||
Description[zh_CN]=一个Win32绘图示例
|
||||
Category=Win32
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
CppName=main.cpp
|
||||
C=WinAnim_c.txt
|
||||
Cpp=WinAnim_c.txt
|
||||
|
||||
[Unit1]
|
||||
CName=resource.rc
|
||||
CppName=resource.rc
|
||||
C=WinAnim_rc.txt
|
||||
Cpp=WinAnim_rc.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=2
|
||||
Type=0
|
|
@ -1,191 +0,0 @@
|
|||
/*
|
||||
Name: WinAnim
|
||||
Author: Brook Miles
|
||||
Description: Making an animation in windows
|
||||
*/
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
static char g_szClassName[] = "MyWindowClass";
|
||||
static HINSTANCE g_hInst = NULL;
|
||||
|
||||
const UINT idTimer1 = 1;
|
||||
UINT nTimerDelay = 10;
|
||||
|
||||
HBITMAP hbmBall, hbmMask;
|
||||
BITMAP bm;
|
||||
|
||||
int ballX, ballY;
|
||||
int deltaX, deltaY;
|
||||
|
||||
int deltaValue = 4;
|
||||
|
||||
void EraseBall(HDC hdc)
|
||||
{
|
||||
RECT rc;
|
||||
rc.left = ballX;
|
||||
rc.top = ballY;
|
||||
rc.right = ballX + bm.bmWidth;
|
||||
rc.bottom = ballY + bm.bmHeight;
|
||||
FillRect(hdc, &rc, (HBRUSH)(COLOR_BTNFACE+1));
|
||||
}
|
||||
|
||||
void DrawBall(HDC hdc)
|
||||
{
|
||||
HDC hdcMemory;
|
||||
hdcMemory = CreateCompatibleDC(hdc);
|
||||
|
||||
SelectObject(hdcMemory, hbmMask);
|
||||
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCAND);
|
||||
|
||||
SelectObject(hdcMemory, hbmBall);
|
||||
BitBlt(hdc, ballX, ballY, bm.bmWidth, bm.bmHeight, hdcMemory, 0, 0, SRCPAINT);
|
||||
|
||||
DeleteDC(hdcMemory);
|
||||
}
|
||||
|
||||
void UpdateBall(HWND hwnd)
|
||||
{
|
||||
RECT rc;
|
||||
GetClientRect(hwnd, &rc);
|
||||
|
||||
ballX += deltaX;
|
||||
ballY += deltaY;
|
||||
|
||||
if(ballX < 0){
|
||||
ballX = 0;
|
||||
deltaX = deltaValue;
|
||||
}
|
||||
else if(ballX + bm.bmWidth > rc.right){
|
||||
ballX = rc.right - bm.bmWidth;
|
||||
deltaX = -deltaValue;
|
||||
}
|
||||
if(ballY < 0){
|
||||
ballY = 0;
|
||||
deltaY = deltaValue;
|
||||
}
|
||||
else if(ballY + bm.bmHeight > rc.bottom){
|
||||
ballY = rc.bottom - bm.bmHeight;
|
||||
deltaY = -deltaValue;
|
||||
}
|
||||
}
|
||||
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
switch(Message)
|
||||
{
|
||||
case WM_CREATE:
|
||||
hbmBall = LoadBitmap(g_hInst, "BALLBMP");
|
||||
hbmMask = LoadBitmap(g_hInst, "MASKBMP");
|
||||
if(!hbmBall || !hbmMask){
|
||||
MessageBox(hwnd, "Load of resources failed.", "Error",
|
||||
MB_OK | MB_ICONEXCLAMATION);
|
||||
return -1;
|
||||
}
|
||||
|
||||
GetObject(hbmBall, sizeof(bm), &bm);
|
||||
SetTimer(hwnd, idTimer1, nTimerDelay, NULL);
|
||||
|
||||
ballX = 0;
|
||||
ballY = 0;
|
||||
deltaX = deltaValue;
|
||||
deltaY = deltaValue;
|
||||
|
||||
break;
|
||||
case WM_TIMER:
|
||||
if(hbmBall && hbmMask)
|
||||
{
|
||||
HDC hdcWindow;
|
||||
hdcWindow = GetDC(hwnd);
|
||||
|
||||
EraseBall(hdcWindow);
|
||||
UpdateBall(hwnd);
|
||||
DrawBall(hdcWindow);
|
||||
|
||||
ReleaseDC(hwnd, hdcWindow);
|
||||
}
|
||||
break;
|
||||
case WM_PAINT:
|
||||
if(hbmBall && hbmMask)
|
||||
{
|
||||
PAINTSTRUCT ps;
|
||||
HDC hdcWindow;
|
||||
hdcWindow = BeginPaint(hwnd, &ps);
|
||||
|
||||
DrawBall(hdcWindow);
|
||||
|
||||
EndPaint(hwnd, &ps);
|
||||
}
|
||||
break;
|
||||
case WM_CLOSE:
|
||||
DestroyWindow(hwnd);
|
||||
break;
|
||||
case WM_DESTROY:
|
||||
KillTimer(hwnd, idTimer1);
|
||||
|
||||
DeleteObject(hbmBall);
|
||||
DeleteObject(hbmMask);
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
default:
|
||||
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
||||
LPSTR lpCmdLine, int nCmdShow)
|
||||
{
|
||||
WNDCLASSEX WndClass;
|
||||
HWND hwnd;
|
||||
MSG Msg;
|
||||
|
||||
g_hInst = hInstance;
|
||||
|
||||
WndClass.cbSize = sizeof(WNDCLASSEX);
|
||||
WndClass.style = 0;
|
||||
WndClass.lpfnWndProc = WndProc;
|
||||
WndClass.cbClsExtra = 0;
|
||||
WndClass.cbWndExtra = 0;
|
||||
WndClass.hInstance = g_hInst;
|
||||
WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
|
||||
WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
WndClass.hbrBackground = (HBRUSH)(COLOR_BTNFACE+1);
|
||||
WndClass.lpszMenuName = NULL;
|
||||
WndClass.lpszClassName = g_szClassName;
|
||||
WndClass.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
|
||||
|
||||
if(!RegisterClassEx(&WndClass))
|
||||
{
|
||||
MessageBox(0, "Window Registration Failed!", "Error!",
|
||||
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
hwnd = CreateWindowEx(
|
||||
WS_EX_CLIENTEDGE,
|
||||
g_szClassName,
|
||||
"A Bitmap Program",
|
||||
WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, CW_USEDEFAULT, 320, 240,
|
||||
NULL, NULL, g_hInst, NULL);
|
||||
|
||||
if(hwnd == NULL)
|
||||
{
|
||||
MessageBox(0, "Window Creation Failed!", "Error!",
|
||||
MB_ICONEXCLAMATION | MB_OK | MB_SYSTEMMODAL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ShowWindow(hwnd, nCmdShow);
|
||||
UpdateWindow(hwnd);
|
||||
|
||||
while(GetMessage(&Msg, NULL, 0, 0))
|
||||
{
|
||||
TranslateMessage(&Msg);
|
||||
DispatchMessage(&Msg);
|
||||
}
|
||||
return Msg.wParam;
|
||||
}
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
BALLBMP BITMAP "ball.bmp" // can be found in the Templates folder, please copy to the project folder
|
||||
MASKBMP BITMAP "ballmask.bmp" // as above
|
|
@ -1,66 +0,0 @@
|
|||
#include <windows.h>
|
||||
|
||||
/* This is where all the input to the window goes to */
|
||||
LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wParam, LPARAM lParam) {
|
||||
switch(Message) {
|
||||
|
||||
/* Upon destruction, tell the main thread to stop */
|
||||
case WM_DESTROY: {
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
}
|
||||
|
||||
/* All other messages (a lot of them) are processed using default procedures */
|
||||
default:
|
||||
return DefWindowProc(hwnd, Message, wParam, lParam);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The 'main' function of Win32 GUI programs: this is where execution starts */
|
||||
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
|
||||
WNDCLASSEX wc; /* A properties struct of our window */
|
||||
HWND hwnd; /* A 'HANDLE', hence the H, or a pointer to our window */
|
||||
MSG msg; /* A temporary location for all messages */
|
||||
|
||||
/* zero out the struct and set the stuff we want to modify */
|
||||
memset(&wc,0,sizeof(wc));
|
||||
wc.cbSize = sizeof(WNDCLASSEX);
|
||||
wc.lpfnWndProc = WndProc; /* This is where we will send messages to */
|
||||
wc.hInstance = hInstance;
|
||||
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
|
||||
|
||||
/* White, COLOR_WINDOW is just a #define for a system color, try Ctrl+Clicking it */
|
||||
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
|
||||
wc.lpszClassName = "WindowClass";
|
||||
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); /* Load a standard icon */
|
||||
wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); /* use the name "A" to use the project icon */
|
||||
|
||||
if(!RegisterClassEx(&wc)) {
|
||||
MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,
|
||||
CW_USEDEFAULT, /* x */
|
||||
CW_USEDEFAULT, /* y */
|
||||
640, /* width */
|
||||
480, /* height */
|
||||
NULL,NULL,hInstance,NULL);
|
||||
|
||||
if(hwnd == NULL) {
|
||||
MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
This is the heart of our program where all input is processed and
|
||||
sent to WndProc. Note that GetMessage blocks code flow until it receives something, so
|
||||
this loop will not produce unreasonably high CPU usage
|
||||
*/
|
||||
while(GetMessage(&msg, NULL, 0, 0) > 0) { /* If no error is received... */
|
||||
TranslateMessage(&msg); /* Translate key codes to chars if present */
|
||||
DispatchMessage(&msg); /* Send it to WndProc */
|
||||
}
|
||||
return msg.wParam;
|
||||
}
|
Before Width: | Height: | Size: 4.2 KiB |
Before Width: | Height: | Size: 630 B |
Before Width: | Height: | Size: 190 B |
Before Width: | Height: | Size: 176 KiB |
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Epitrochoid
|
||||
Name[zh_CN]=外旋轮线
|
||||
Icon=Epitrochoid.ico
|
||||
Description=A simple epitrochoid drawing app
|
||||
Description[zh_CN]=外旋轮线绘制程序
|
||||
Category=Game
|
||||
Category[zh_CN]=游戏
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=epitrochoid_c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
IsCpp=0
|
||||
linker=-lrdrawing -lraylib -lopengl32 -lgdi32 -lwinmm
|
||||
ExecEncoding=UTF-8
|
|
@ -1,125 +0,0 @@
|
|||
#include <raylib.h>
|
||||
#include <rdrawing.h>
|
||||
#include <math.h>
|
||||
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
#include <raygui.h>
|
||||
|
||||
void updateRadius(int baseL, int outerL, int pointL, int *pBaseR, int *pOuterR, int *pPointR) {
|
||||
int totalL=baseL+outerL;
|
||||
if (pointL>outerL)
|
||||
totalL+=pointL;
|
||||
else
|
||||
totalL+=outerL;
|
||||
int totalR = 420;
|
||||
int remainder = totalR % totalL;
|
||||
if (remainder!=0) {
|
||||
if (remainder < totalL / 2) {
|
||||
totalR -= remainder;
|
||||
} else {
|
||||
totalR += ( totalL - remainder);
|
||||
}
|
||||
}
|
||||
*pBaseR = (totalR) / totalL * baseL;
|
||||
*pOuterR = (totalR) / totalL * outerL;
|
||||
*pPointR = (totalR) / totalL * pointL;
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
int baseL=2;
|
||||
int outerL=13;
|
||||
int pointL=3;
|
||||
int baseR,outerR,pointR;
|
||||
int cx=450,cy=450;
|
||||
int speed = 1;
|
||||
Color trackColor = BLUE;
|
||||
updateRadius(baseL, outerL, pointL, &baseR, &outerR, & pointR);
|
||||
InitWindow(1300,900,"Epitrochoid");
|
||||
SetTraceLogLevel(LOG_WARNING);
|
||||
SetTargetFPS(60);
|
||||
GuiSetStyle(DEFAULT,TEXT_SIZE,20);
|
||||
|
||||
Image trackImage=GenImageColor(900,900,WHITE);
|
||||
//border
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
|
||||
Image circlesImage = GenImageColor(900,900,BLANK);
|
||||
float r=0;
|
||||
int lastx,lasty;
|
||||
lasty=cy;
|
||||
lastx=cx+(baseR+outerR-pointR);
|
||||
int frameCount = 0;
|
||||
while(!WindowShouldClose()) {
|
||||
//GUI
|
||||
int newOuterL = GuiSliderBar((Rectangle){ 70, 20, 200, 30 },"Outer",TextFormat("%i", (int)outerL), outerL, 1, 50);
|
||||
int newBaseL = GuiSliderBar((Rectangle){ 70, 60, 200, 30 },"Base",TextFormat("%i", (int)baseL), baseL, 1, 50);
|
||||
int newPointL = GuiSliderBar((Rectangle){ 70, 100, 200, 30 },"Point",TextFormat("%i", (int)pointL), pointL, 1, 50);
|
||||
speed = GuiSliderBar((Rectangle){ 70, 150, 200, 30 },"Speed",TextFormat("%i", (int)speed), speed, 1, 50);
|
||||
GuiLabel((Rectangle){ 20, 220, 80, 30 },TextFormat("Color: 0x%X%X%X ",(int)(trackColor.r), (int)(trackColor.g),(int)(trackColor.b)));
|
||||
trackColor= GuiColorPicker((Rectangle){ 50, 250, 196, 192 }, NULL, trackColor);
|
||||
int doClear = GuiButton((Rectangle){ 120, 700, 80, 30 },"Clear");
|
||||
if (newOuterL!=outerL || newBaseL!=baseL || newPointL!=pointL) {
|
||||
if (newOuterL!=outerL)
|
||||
pointL=newOuterL;
|
||||
else
|
||||
pointL=newPointL;
|
||||
outerL=newOuterL;
|
||||
baseL=newBaseL;
|
||||
updateRadius(baseL, outerL, pointL, &baseR, &outerR, & pointR);
|
||||
lasty=cy;
|
||||
lastx=cx+(baseR+outerR-pointR);
|
||||
r=0;
|
||||
ImageClearBackground(&trackImage,WHITE);
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
} else if (doClear) {
|
||||
ImageClearBackground(&trackImage,WHITE);
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
}
|
||||
//update datas
|
||||
r+=0.01;
|
||||
float outerCX=cx+ (baseR+outerR)*cos(r);
|
||||
float outerCY=cy+ (baseR+outerR)*sin(r);
|
||||
float theta = r * (baseL+outerL) / outerL;
|
||||
int x=round(outerCX - pointR * cos(theta));
|
||||
int y=round(outerCY - pointR * sin(theta));
|
||||
|
||||
//update image (in CPU)
|
||||
//ImageClearBackground(&trackImage,WHITE);
|
||||
ImageDrawLineEx(&trackImage,lastx,lasty,x,y,3,trackColor);
|
||||
|
||||
frameCount++;
|
||||
if (frameCount>=speed) {
|
||||
ImageClearBackground(&circlesImage,BLANK);
|
||||
//base circle
|
||||
ImageDrawCircleEx(&circlesImage,cx,cy,baseR,1,LIGHTRED);
|
||||
ImageDrawCircleEx(&circlesImage,outerCX,outerCY,outerR,1,LIGHTSLATEGRAY);
|
||||
ImageDrawLineEx(&circlesImage,cx,cy,outerCX,outerCY,1,LIGHTRED);
|
||||
ImageDrawLineEx(&circlesImage,x,y,outerCX,outerCY,1,LIGHTSLATEGRAY);
|
||||
ImageDrawPointEx(&circlesImage,x,y,7,RED);
|
||||
|
||||
//Drawing in GPU
|
||||
Texture trackTexture = LoadTextureFromImage(trackImage);
|
||||
Texture circlesTexture = LoadTextureFromImage(circlesImage);
|
||||
BeginDrawing();
|
||||
ClearBackground(WHITE);
|
||||
DrawTexture(trackTexture,300,0,WHITE);
|
||||
DrawTexture(circlesTexture,300,0,WHITE);
|
||||
EndDrawing();
|
||||
UnloadTexture(circlesTexture);
|
||||
UnloadTexture(trackTexture);
|
||||
frameCount=0;
|
||||
}
|
||||
|
||||
lastx=x;
|
||||
lasty=y;
|
||||
}
|
||||
|
||||
//Clean up
|
||||
UnloadImage(circlesImage);
|
||||
UnloadImage(trackImage);
|
||||
CloseWindow();
|
||||
}
|
Before Width: | Height: | Size: 94 KiB |
|
@ -1,20 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=Hypotrochoid
|
||||
Name[zh_CN]=内旋轮线
|
||||
Icon=hypotrochoid.ico
|
||||
Description=A simple hypotrochoid drawing app
|
||||
Description[zh_CN]=内旋轮线绘制程序
|
||||
Category=Game
|
||||
Category[zh_CN]=游戏
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=hypotrochoid_c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
IsCpp=0
|
||||
linker=-lrdrawing -lraylib -lopengl32 -lgdi32 -lwinmm
|
||||
ExecEncoding=UTF-8
|
|
@ -1,140 +0,0 @@
|
|||
#include <raylib.h>
|
||||
#include <rdrawing.h>
|
||||
#include <math.h>
|
||||
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
#include <raygui.h>
|
||||
|
||||
void updateRadius(int baseL, int innerL,int pointL, int *pBaseR, int *pInnerR, int *pPointR) {
|
||||
int totalL=baseL;
|
||||
if (innerL>baseL) {
|
||||
if (innerL>pointL)
|
||||
totalL = (2*innerL-baseL);
|
||||
else {
|
||||
totalL = (innerL+pointL-baseL);
|
||||
}
|
||||
} else {
|
||||
if (pointL>innerL)
|
||||
totalL = baseL-innerL+pointL;
|
||||
}
|
||||
int totalR = 420;
|
||||
int remainder = totalR % totalL;
|
||||
if (remainder!=0) {
|
||||
if (remainder < totalL / 2) {
|
||||
totalR -= remainder;
|
||||
} else {
|
||||
totalR += ( totalL - remainder);
|
||||
}
|
||||
}
|
||||
*pBaseR = totalR / totalL * baseL;
|
||||
*pInnerR = totalR / totalL * innerL;
|
||||
*pPointR = totalR / totalL * pointL;
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
int baseL=6;
|
||||
int innerL=3;
|
||||
int pointL=6;
|
||||
int baseR,innerR,pointR;
|
||||
int cx=450,cy=450;
|
||||
int speed = 1;
|
||||
Color trackColor = BLUE;
|
||||
updateRadius(baseL, innerL, pointL, &baseR, &innerR, &pointR);
|
||||
InitWindow(1300,900,"Hypotrochoid");
|
||||
SetTraceLogLevel(LOG_WARNING);
|
||||
SetTargetFPS(60);
|
||||
GuiSetStyle(DEFAULT,TEXT_SIZE,20);
|
||||
|
||||
Image trackImage=GenImageColor(900,900,WHITE);
|
||||
//border
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
|
||||
Image circlesImage = GenImageColor(900,900,BLANK);
|
||||
float r=0;
|
||||
int lastx,lasty;
|
||||
bool skip=true;
|
||||
lasty=cy;
|
||||
lastx=cx+baseR;
|
||||
int frameCount = 0;
|
||||
while(!WindowShouldClose()) {
|
||||
//GUI
|
||||
int newInnerL = GuiSliderBar((Rectangle){ 70, 20, 200, 30 },"Inner",TextFormat("%i", (int)innerL), innerL, 1, 50);
|
||||
int newBaseL = GuiSliderBar((Rectangle){ 70, 60, 200, 30 },"Base",TextFormat("%i", (int)baseL), baseL, 1, 50);
|
||||
int newPointL = GuiSliderBar((Rectangle){ 70, 100, 200, 30 },"Point",TextFormat("%i", (int)pointL), pointL, 1, 50);
|
||||
speed = GuiSliderBar((Rectangle){ 70, 150, 200, 30 },"Speed",TextFormat("%i", (int)speed), speed, 1, 50);
|
||||
GuiLabel((Rectangle){ 20, 220, 80, 30 },TextFormat("Color: 0x%X%X%X ",(int)(trackColor.r), (int)(trackColor.g),(int)(trackColor.b)));
|
||||
trackColor= GuiColorPicker((Rectangle){ 50, 250, 196, 192 }, NULL, trackColor);
|
||||
int doClear = GuiButton((Rectangle){ 120, 700, 80, 30 },"Clear");
|
||||
if (newInnerL!=innerL || newBaseL!=baseL || newPointL!=pointL) {
|
||||
if (newInnerL!=innerL)
|
||||
pointL=newInnerL;
|
||||
else
|
||||
pointL=newPointL;
|
||||
innerL=newInnerL;
|
||||
baseL=newBaseL;
|
||||
updateRadius(baseL, innerL, pointL, &baseR, &innerR, &pointR);
|
||||
r=0;
|
||||
skip=true;
|
||||
ImageClearBackground(&trackImage,WHITE);
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
} else if (doClear) {
|
||||
ImageClearBackground(&trackImage,WHITE);
|
||||
ImageFillRectangleEx(&trackImage,0,0,900,900,LIGHTGRAY);
|
||||
ImageFillRectangleEx(&trackImage,5,5,890,890,WHITE);
|
||||
}
|
||||
//update datas
|
||||
float innerCX=cx+ (baseR-innerR)*cos(r);
|
||||
float innerCY=cy+ (baseR-innerR)*sin(r);
|
||||
int x,y;
|
||||
float theta;
|
||||
if (innerL<baseL) {
|
||||
theta = r * (baseL-innerL) / innerL;
|
||||
x=round(innerCX + pointR * cos(theta));
|
||||
y=round(innerCY - pointR * sin(theta));
|
||||
} else {
|
||||
theta = r * (innerL-baseL) / innerL;
|
||||
x=round(innerCX + pointR * cos(theta));
|
||||
y=round(innerCY + pointR * sin(theta));
|
||||
}
|
||||
|
||||
//update image (in CPU)
|
||||
//ImageClearBackground(&trackImage,WHITE);
|
||||
if (!skip)
|
||||
ImageDrawLineEx(&trackImage,lastx,lasty,x,y,3,trackColor);
|
||||
|
||||
frameCount++;
|
||||
if (frameCount>=speed) {
|
||||
ImageClearBackground(&circlesImage,BLANK);
|
||||
//base circle
|
||||
ImageDrawCircleEx(&circlesImage,cx,cy,baseR,1,LIGHTRED);
|
||||
ImageDrawCircleEx(&circlesImage,innerCX,innerCY,innerR,1,LIGHTGRAY);
|
||||
ImageDrawLineEx(&circlesImage,innerCX,innerCY,cx,cy,1,LIGHTRED);
|
||||
ImageDrawLineEx(&circlesImage,innerCX,innerCY,x,y,1,LIGHTGRAY);
|
||||
ImageDrawPointEx(&circlesImage,x,y,7,RED);
|
||||
|
||||
//Drawing in GPU
|
||||
Texture trackTexture = LoadTextureFromImage(trackImage);
|
||||
Texture circlesTexture = LoadTextureFromImage(circlesImage);
|
||||
BeginDrawing();
|
||||
ClearBackground(WHITE);
|
||||
DrawTexture(trackTexture,300,0,WHITE);
|
||||
DrawTexture(circlesTexture,300,0,WHITE);
|
||||
EndDrawing();
|
||||
UnloadTexture(circlesTexture);
|
||||
UnloadTexture(trackTexture);
|
||||
frameCount=0;
|
||||
}
|
||||
lastx=x;
|
||||
lasty=y;
|
||||
skip=false;
|
||||
r+=0.01;
|
||||
}
|
||||
|
||||
//Clean up
|
||||
UnloadImage(circlesImage);
|
||||
UnloadImage(trackImage);
|
||||
CloseWindow();
|
||||
}
|
Before Width: | Height: | Size: 4.2 KiB |
|
@ -1,19 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=MySQL(MyriaDB)
|
||||
Icon=mysql.ico
|
||||
Description=A Sqlite3 API Example
|
||||
Description[zh_CN]=MySQL数据库示例程序
|
||||
Category=Database
|
||||
Category[zh_CN]=数据库
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=mysql_c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
Compiler=
|
||||
CppCompiler=
|
||||
Linker=-lmysqlclient -lws2_32 -ladvapi32 -lkernel32 -lshlwapi -lcrypt32 -lz -lsecur32
|
|
@ -1,103 +0,0 @@
|
|||
/*
|
||||
A demo for mysql client, from https://zetcode.com/db/mysqlc/
|
||||
*/
|
||||
#include <mysql/mysql.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void finish_with_error(MYSQL *con)
|
||||
{
|
||||
fprintf(stderr, "%s\n", mysql_error(con));
|
||||
mysql_close(con);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
MYSQL *con = mysql_init(NULL);
|
||||
|
||||
if (con == NULL)
|
||||
{
|
||||
fprintf(stderr, "%s\n", mysql_error(con));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (mysql_real_connect(con, "localhost", "root", "",
|
||||
"testdb", 0, NULL, 0) == NULL)
|
||||
{
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
//Create table
|
||||
if (mysql_query(con, "DROP TABLE IF EXISTS cars")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "CREATE TABLE cars(id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(255), price INT)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
// insert datas
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(1,'Audi',52642)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(2,'Mercedes',57127)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(3,'Skoda',9000)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(4,'Volvo',29000)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(5,'Bentley',350000)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(6,'Citroen',21000)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(7,'Hummer',41400)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
if (mysql_query(con, "INSERT INTO cars VALUES(8,'Volkswagen',21600)")) {
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
//query datas
|
||||
if (mysql_query(con, "SELECT * FROM cars"))
|
||||
{
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
MYSQL_RES *result = mysql_store_result(con);
|
||||
|
||||
if (result == NULL)
|
||||
{
|
||||
finish_with_error(con);
|
||||
}
|
||||
|
||||
int num_fields = mysql_num_fields(result);
|
||||
|
||||
MYSQL_ROW row;
|
||||
|
||||
while ((row = mysql_fetch_row(result)))
|
||||
{
|
||||
for(int i = 0; i < num_fields; i++)
|
||||
{
|
||||
printf("%s ", row[i] ? row[i] : "NULL");
|
||||
}
|
||||
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
mysql_free_result(result);
|
||||
mysql_close(con);
|
||||
exit(0);
|
||||
}
|
Before Width: | Height: | Size: 200 KiB |
|
@ -1,21 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=raygui
|
||||
Name[zh_CN]=raygui
|
||||
Icon=raygui.ico
|
||||
Description=raygui demo
|
||||
Description[zh_CN]=Raygui演示
|
||||
Category=Multimedia
|
||||
Category[zh_CN]=多媒体
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=raygui_c.txt
|
||||
|
||||
[Project]
|
||||
UnitCount=1
|
||||
Type=1
|
||||
IsCpp=0
|
||||
linker=-lraylib -lopengl32 -lgdi32 -lwinmm
|
||||
ExecEncoding=UTF-8
|
||||
|
|
@ -1,251 +0,0 @@
|
|||
/*******************************************************************************************
|
||||
*
|
||||
* raygui - controls test suite
|
||||
*
|
||||
* TEST CONTROLS:
|
||||
* - GuiDropdownBox()
|
||||
* - GuiCheckBox()
|
||||
* - GuiSpinner()
|
||||
* - GuiValueBox()
|
||||
* - GuiTextBox()
|
||||
* - GuiButton()
|
||||
* - GuiComboBox()
|
||||
* - GuiListView()
|
||||
* - GuiToggleGroup()
|
||||
* - GuiTextBoxMulti()
|
||||
* - GuiColorPicker()
|
||||
* - GuiSlider()
|
||||
* - GuiSliderBar()
|
||||
* - GuiProgressBar()
|
||||
* - GuiColorBarAlpha()
|
||||
* - GuiScrollPanel()
|
||||
*
|
||||
*
|
||||
* DEPENDENCIES:
|
||||
* raylib 4.0 - Windowing/input management and drawing.
|
||||
* raygui 3.2 - Immediate-mode GUI controls.
|
||||
*
|
||||
* COMPILATION (Windows - MinGW):
|
||||
* gcc -o $(NAME_PART).exe $(FILE_NAME) -I../../src -lraylib -lopengl32 -lgdi32 -std=c99
|
||||
*
|
||||
* LICENSE: zlib/libpng
|
||||
*
|
||||
* Copyright (c) 2016-2022 Ramon Santamaria (@raysan5)
|
||||
*
|
||||
**********************************************************************************************/
|
||||
|
||||
#include <raylib.h>
|
||||
|
||||
#define RAYGUI_IMPLEMENTATION
|
||||
//#define RAYGUI_CUSTOM_ICONS // It requires providing gui_icons.h in the same directory
|
||||
//#include "gui_icons.h" // External icons data provided, it can be generated with rGuiIcons tool
|
||||
#include <raygui.h>
|
||||
|
||||
#include <string.h> // Required for: strcpy()
|
||||
|
||||
//------------------------------------------------------------------------------------
|
||||
// Program main entry point
|
||||
//------------------------------------------------------------------------------------
|
||||
int main()
|
||||
{
|
||||
// Initialization
|
||||
//---------------------------------------------------------------------------------------
|
||||
const int screenWidth = 690;
|
||||
const int screenHeight = 560;
|
||||
|
||||
InitWindow(screenWidth, screenHeight, "raygui - controls test suite");
|
||||
SetExitKey(0);
|
||||
|
||||
// GUI controls initialization
|
||||
//----------------------------------------------------------------------------------
|
||||
//GuiSetStyle(DEFAULT,TEXT_SIZE,16);
|
||||
int dropdownBox000Active = 0;
|
||||
bool dropDown000EditMode = false;
|
||||
|
||||
int dropdownBox001Active = 0;
|
||||
bool dropDown001EditMode = false;
|
||||
|
||||
int spinner001Value = 0;
|
||||
bool spinnerEditMode = false;
|
||||
|
||||
int valueBox002Value = 0;
|
||||
bool valueBoxEditMode = false;
|
||||
|
||||
char textBoxText[64] = "Text box";
|
||||
bool textBoxEditMode = false;
|
||||
|
||||
int listViewScrollIndex = 0;
|
||||
int listViewActive = -1;
|
||||
|
||||
int listViewExScrollIndex = 0;
|
||||
int listViewExActive = 2;
|
||||
int listViewExFocus = -1;
|
||||
const char *listViewExList[8] = { "This", "is", "a", "list view", "with", "disable", "elements", "amazing!" };
|
||||
|
||||
char multiTextBoxText[256] = "Multi text box";
|
||||
bool multiTextBoxEditMode = false;
|
||||
Color colorPickerValue = RED;
|
||||
|
||||
int sliderValue = 50;
|
||||
int sliderBarValue = 60;
|
||||
float progressValue = 0.4f;
|
||||
|
||||
bool forceSquaredChecked = false;
|
||||
|
||||
float alphaValue = 0.5f;
|
||||
|
||||
int comboBoxActive = 1;
|
||||
|
||||
int toggleGroupActive = 0;
|
||||
|
||||
Vector2 viewScroll = { 0, 0 };
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Custom GUI font loading
|
||||
//Font font = LoadFontEx("fonts/rainyhearts16.ttf", 12, 0, 0);
|
||||
//GuiSetFont(font);
|
||||
|
||||
bool exitWindow = false;
|
||||
bool showMessageBox = false;
|
||||
|
||||
char textInput[256] = { 0 };
|
||||
bool showTextInputBox = false;
|
||||
|
||||
char textInputFileName[256] = { 0 };
|
||||
|
||||
SetTargetFPS(60);
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
// Main game loop
|
||||
while (!exitWindow) // Detect window close button or ESC key
|
||||
{
|
||||
// Update
|
||||
//----------------------------------------------------------------------------------
|
||||
exitWindow = WindowShouldClose();
|
||||
|
||||
if (IsKeyPressed(KEY_ESCAPE)) showMessageBox = !showMessageBox;
|
||||
|
||||
if (IsKeyDown(KEY_LEFT_CONTROL) && IsKeyPressed(KEY_S)) showTextInputBox = true;
|
||||
|
||||
// incompatible with raylib 4.0
|
||||
// if (IsFileDropped())
|
||||
// {
|
||||
// int dropFileCount = 0;
|
||||
// char **droppedFiles = LoadDroppedFiles(&dropFileCount);
|
||||
//
|
||||
// if ((dropFileCount > 0) && IsFileExtension(droppedFiles[0], ".rgs")) GuiLoadStyle(droppedFiles[0]);
|
||||
//
|
||||
// UnloadDroppedFiles(); // Clear internal buffers
|
||||
// }
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
// Draw
|
||||
//----------------------------------------------------------------------------------
|
||||
BeginDrawing();
|
||||
|
||||
ClearBackground(GetColor(GuiGetStyle(DEFAULT, BACKGROUND_COLOR)));
|
||||
|
||||
// raygui: controls drawing
|
||||
//----------------------------------------------------------------------------------
|
||||
if (dropDown000EditMode || dropDown001EditMode) GuiLock();
|
||||
else if (!dropDown000EditMode && !dropDown001EditMode) GuiUnlock();
|
||||
//GuiDisable();
|
||||
|
||||
// First GUI column
|
||||
//GuiSetStyle(CHECKBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
|
||||
forceSquaredChecked = GuiCheckBox((Rectangle){ 25, 108, 15, 15 }, "FORCE CHECK!", forceSquaredChecked);
|
||||
|
||||
GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
|
||||
//GuiSetStyle(VALUEBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
|
||||
if (GuiSpinner((Rectangle){ 25, 135, 125, 30 }, NULL, &spinner001Value, 0, 100, spinnerEditMode)) spinnerEditMode = !spinnerEditMode;
|
||||
if (GuiValueBox((Rectangle){ 25, 175, 125, 30 }, NULL, &valueBox002Value, 0, 100, valueBoxEditMode)) valueBoxEditMode = !valueBoxEditMode;
|
||||
GuiSetStyle(TEXTBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
|
||||
if (GuiTextBox((Rectangle){ 25, 215, 125, 30 }, textBoxText, 64, textBoxEditMode)) textBoxEditMode = !textBoxEditMode;
|
||||
|
||||
GuiSetStyle(BUTTON, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
|
||||
|
||||
if (GuiButton((Rectangle){ 25, 255, 125, 30 }, GuiIconText(ICON_FILE_SAVE, "Save File"))) showTextInputBox = true;
|
||||
|
||||
GuiGroupBox((Rectangle){ 25, 310, 125, 150 }, "STATES");
|
||||
//GuiLock();
|
||||
GuiSetState(STATE_NORMAL); if (GuiButton((Rectangle){ 30, 320, 115, 30 }, "NORMAL")) { }
|
||||
GuiSetState(STATE_FOCUSED); if (GuiButton((Rectangle){ 30, 355, 115, 30 }, "FOCUSED")) { }
|
||||
GuiSetState(STATE_PRESSED); if (GuiButton((Rectangle){ 30, 390, 115, 30 }, "#15#PRESSED")) { }
|
||||
GuiSetState(STATE_DISABLED); if (GuiButton((Rectangle){ 30, 425, 115, 30 }, "DISABLED")) { }
|
||||
GuiSetState(STATE_NORMAL);
|
||||
//GuiUnlock();
|
||||
|
||||
comboBoxActive = GuiComboBox((Rectangle){ 25, 470, 125, 30 }, "ONE;TWO;THREE;FOUR", comboBoxActive);
|
||||
|
||||
// NOTE: GuiDropdownBox must draw after any other control that can be covered on unfolding
|
||||
GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_LEFT);
|
||||
if (GuiDropdownBox((Rectangle){ 25, 65, 125, 30 }, "#01#ONE;#02#TWO;#03#THREE;#04#FOUR", &dropdownBox001Active, dropDown001EditMode)) dropDown001EditMode = !dropDown001EditMode;
|
||||
|
||||
GuiSetStyle(DROPDOWNBOX, TEXT_ALIGNMENT, TEXT_ALIGN_CENTER);
|
||||
if (GuiDropdownBox((Rectangle){ 25, 25, 125, 30 }, "ONE;TWO;THREE", &dropdownBox000Active, dropDown000EditMode)) dropDown000EditMode = !dropDown000EditMode;
|
||||
|
||||
// Second GUI column
|
||||
listViewActive = GuiListView((Rectangle){ 165, 25, 140, 140 }, "Charmander;Bulbasaur;#18#Squirtel;Pikachu;Eevee;Pidgey", &listViewScrollIndex, listViewActive);
|
||||
listViewExActive = GuiListViewEx((Rectangle){ 165, 180, 140, 200 }, listViewExList, 8, &listViewExFocus, &listViewExScrollIndex, listViewExActive);
|
||||
|
||||
toggleGroupActive = GuiToggleGroup((Rectangle){ 165, 400, 140, 25 }, "#1#ONE\n#3#TWO\n#8#THREE\n#23#", toggleGroupActive);
|
||||
|
||||
// Third GUI column
|
||||
if (GuiTextBoxMulti((Rectangle){ 320, 25, 225, 140 }, multiTextBoxText, 256, multiTextBoxEditMode)) multiTextBoxEditMode = !multiTextBoxEditMode;
|
||||
colorPickerValue = GuiColorPicker((Rectangle){ 320, 185, 196, 192 }, NULL, colorPickerValue);
|
||||
|
||||
sliderValue = GuiSlider((Rectangle){ 355, 400, 165, 20 }, "TEST", TextFormat("%2.2f", (float)sliderValue), sliderValue, -50, 100);
|
||||
sliderBarValue = GuiSliderBar((Rectangle){ 320, 430, 200, 20 }, NULL, TextFormat("%i", (int)sliderBarValue), sliderBarValue, 0, 100);
|
||||
progressValue = GuiProgressBar((Rectangle){ 320, 460, 200, 20 }, NULL, NULL, progressValue, 0, 1);
|
||||
|
||||
// NOTE: View rectangle could be used to perform some scissor test
|
||||
Rectangle view = GuiScrollPanel((Rectangle){ 560, 25, 100, 160 }, NULL, (Rectangle){ 560, 25, 200, 400 }, &viewScroll);
|
||||
|
||||
GuiPanel((Rectangle){ 560, 25 + 180, 100, 160 }, "Panel Info");
|
||||
|
||||
GuiGrid((Rectangle) { 560, 25 + 180 + 180, 100, 120 }, NULL, 20, 2);
|
||||
|
||||
GuiStatusBar((Rectangle){ 0, (float)GetScreenHeight() - 20, (float)GetScreenWidth(), 20 }, "This is a status bar");
|
||||
|
||||
alphaValue = GuiColorBarAlpha((Rectangle){ 320, 490, 200, 30 }, NULL, alphaValue);
|
||||
|
||||
if (showMessageBox)
|
||||
{
|
||||
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
|
||||
int result = GuiMessageBox((Rectangle){ (float)GetScreenWidth()/2 - 125, (float)GetScreenHeight()/2 - 50, 250, 100 }, GuiIconText(ICON_EXIT, "Close Window"), "Do you really want to exit?", "Yes;No");
|
||||
|
||||
if ((result == 0) || (result == 2)) showMessageBox = false;
|
||||
else if (result == 1) exitWindow = true;
|
||||
}
|
||||
|
||||
if (showTextInputBox)
|
||||
{
|
||||
DrawRectangle(0, 0, GetScreenWidth(), GetScreenHeight(), Fade(RAYWHITE, 0.8f));
|
||||
int result = GuiTextInputBox((Rectangle){ (float)GetScreenWidth()/2 - 120, (float)GetScreenHeight()/2 - 60, 240, 140 }, "Save", GuiIconText(ICON_FILE_SAVE, "Save file as..."), "Ok;Cancel", textInput, 255, NULL);
|
||||
|
||||
if (result == 1)
|
||||
{
|
||||
// TODO: Validate textInput value and save
|
||||
|
||||
strcpy(textInputFileName, textInput);
|
||||
}
|
||||
|
||||
if ((result == 0) || (result == 1) || (result == 2))
|
||||
{
|
||||
showTextInputBox = false;
|
||||
strcpy(textInput, "\0");
|
||||
}
|
||||
}
|
||||
//----------------------------------------------------------------------------------
|
||||
|
||||
EndDrawing();
|
||||
//----------------------------------------------------------------------------------
|
||||
}
|
||||
|
||||
// De-Initialization
|
||||
//--------------------------------------------------------------------------------------
|
||||
CloseWindow(); // Close window and OpenGL context
|
||||
//--------------------------------------------------------------------------------------
|
||||
|
||||
return 0;
|
||||
}
|
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 66 KiB |
Before Width: | Height: | Size: 24 KiB |
|
@ -1,29 +0,0 @@
|
|||
[Template]
|
||||
ver=2
|
||||
Name=raylib
|
||||
Name[zh_CN]=raylib
|
||||
Icon=raylib-game.ico
|
||||
Description=A simple interactive animation using raylib ( https://raylib.com )
|
||||
Description[zh_CN]=简单的raylib交互动画 ( https://raylib.com )
|
||||
Category=Multimedia
|
||||
Category[zh_CN]=多媒体
|
||||
|
||||
[Unit0]
|
||||
CName=main.c
|
||||
C=raylib_c.txt
|
||||
|
||||
[Unit1]
|
||||
Source=raylib_boom.wav
|
||||
Target=boom.wav
|
||||
|
||||
[Unit2]
|
||||
Source=raylib_explosion.png
|
||||
Target=explosion.png
|
||||
|
||||
[Project]
|
||||
UnitCount=3
|
||||
Type=1
|
||||
IsCpp=0
|
||||
linker=-lraylib -lopengl32 -lgdi32 -lwinmm
|
||||
ExecEncoding=UTF-8
|
||||
|