Teapot 3D model data moved to app resources
* GLTeapot 3D model data moved from the text file "teapot.data" into Application resources; * Fixes #4934 and completes GCI 2011 task made by Aleksas Pantechovskis. Thanks for contribution!!! Signed-off-by: Siarzhuk Zharski <[email protected]>
This commit is contained in:
committed by
Siarzhuk Zharski
parent
a2ef4fa88a
commit
1bc51c2392
@@ -16,12 +16,17 @@
|
|||||||
This file may be used under the terms of the Be Sample Code License.
|
This file may be used under the terms of the Be Sample Code License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include "GLObject.h"
|
#include "GLObject.h"
|
||||||
|
|
||||||
|
#include <Application.h>
|
||||||
#include <GL/gl.h>
|
#include <GL/gl.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
|
#include <Resources.h>
|
||||||
|
|
||||||
#include "glob.h"
|
#include "glob.h"
|
||||||
|
|
||||||
|
|
||||||
struct material {
|
struct material {
|
||||||
float ambient[3], diffuse[3], specular[3];
|
float ambient[3], diffuse[3], specular[3];
|
||||||
};
|
};
|
||||||
@@ -141,6 +146,7 @@ GLObject::MenuInvoked(BPoint point)
|
|||||||
setEvent(fObjView->drawEvent);
|
setEvent(fObjView->drawEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
GLObject::Solidity() const
|
GLObject::Solidity() const
|
||||||
{
|
{
|
||||||
@@ -148,6 +154,7 @@ GLObject::Solidity() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
GLObject::SpinIt()
|
GLObject::SpinIt()
|
||||||
{
|
{
|
||||||
@@ -200,55 +207,67 @@ GLObject::Draw(bool forID, float IDcolor[])
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
TriangleObject::TriangleObject(ObjectView* ov, char* filename)
|
TriangleObject::TriangleObject(ObjectView* ov)
|
||||||
: GLObject(ov),
|
:
|
||||||
fPoints(100,100),
|
GLObject(ov),
|
||||||
fTriangles(100,100),
|
fStatus(B_NO_INIT),
|
||||||
fQs(50,50)
|
fPoints(100, 100),
|
||||||
|
fTriangles(100, 100),
|
||||||
|
fQs(50, 50)
|
||||||
{
|
{
|
||||||
|
BResources *res = BApplication::AppResources();
|
||||||
|
if (res == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
size_t size = 0;
|
||||||
|
int32 *arrayOfPoints
|
||||||
|
= (int32*)res->LoadResource(B_RAW_TYPE, "points", &size);
|
||||||
|
if (arrayOfPoints == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
float maxp = 0;
|
float maxp = 0;
|
||||||
int numPt,numTri;
|
size_t numPt = size / sizeof(int32);
|
||||||
|
for (size_t i = 0; i < numPt; i += 6) {
|
||||||
FILE* f = fopen(filename,"r");
|
|
||||||
fscanf(f,"%d",&numPt);
|
|
||||||
// printf("Points: %d\n",numPt);
|
|
||||||
for (int i = 0; i < numPt; i++) {
|
|
||||||
point p;
|
point p;
|
||||||
fscanf(f,"%f %f %f %f %f %f",
|
p.x = 1e-6 * arrayOfPoints[i];
|
||||||
&p.x,
|
p.y = 1e-6 * arrayOfPoints[i + 1];
|
||||||
&p.y,
|
p.z = 1e-6 * arrayOfPoints[i + 2];
|
||||||
&p.z,
|
p.nx = 1e-6 * arrayOfPoints[i + 3];
|
||||||
&p.nx,
|
p.ny = 1e-6 * arrayOfPoints[i + 4];
|
||||||
&p.ny,
|
p.nz = 1e-6 * arrayOfPoints[i + 5];
|
||||||
&p.nz);
|
|
||||||
if (fabs(p.x) > maxp)
|
if (fabs(p.x) > maxp)
|
||||||
maxp = fabs(p.x);
|
maxp = fabs(p.x);
|
||||||
if (fabs(p.y) > maxp)
|
if (fabs(p.y) > maxp)
|
||||||
maxp = fabs(p.y);
|
maxp = fabs(p.y);
|
||||||
if (fabs(p.z) > maxp)
|
if (fabs(p.z) > maxp)
|
||||||
maxp = fabs(p.z);
|
maxp = fabs(p.z);
|
||||||
|
|
||||||
fPoints.add(p);
|
fPoints.add(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 0; i < fPoints.num_items; i++) {
|
for (int i = 0; i < fPoints.num_items; i++) {
|
||||||
fPoints[i].x /= maxp;
|
fPoints[i].x /= maxp;
|
||||||
fPoints[i].y /= maxp;
|
fPoints[i].y /= maxp;
|
||||||
fPoints[i].z /= maxp;
|
fPoints[i].z /= maxp;
|
||||||
}
|
}
|
||||||
|
|
||||||
fscanf(f,"%d",&numTri);
|
int32 *arrayOfTriangles
|
||||||
// printf("Triangles: %d\n",numTri);
|
= (int32*)res->LoadResource(B_RAW_TYPE, "triangles", &size);
|
||||||
int tpts = 0;
|
if (arrayOfTriangles == NULL)
|
||||||
for (int i = 0; i < numTri; i++) {
|
return;
|
||||||
|
|
||||||
|
size_t numTriPoints = size / sizeof(int32);
|
||||||
|
for (size_t i = 0; i < numTriPoints; i += 3) {
|
||||||
tri t;
|
tri t;
|
||||||
fscanf(f,"%d %d %d",
|
t.p1 = arrayOfTriangles[i];
|
||||||
&t.p1,
|
t.p2 = arrayOfTriangles[i + 1];
|
||||||
&t.p2,
|
t.p3 = arrayOfTriangles[i + 2];
|
||||||
&t.p3);
|
|
||||||
fTriangles.add(t);
|
fTriangles.add(t);
|
||||||
tpts += 3;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
size_t numTri = numTriPoints / 3;
|
||||||
|
|
||||||
int qpts = 4;
|
int qpts = 4;
|
||||||
int qp[1024];
|
int qp[1024];
|
||||||
quadStrip q;
|
quadStrip q;
|
||||||
@@ -259,37 +278,37 @@ TriangleObject::TriangleObject(ObjectView* ov, char* filename)
|
|||||||
q.pts[1] = fTriangles[0].p3;
|
q.pts[1] = fTriangles[0].p3;
|
||||||
q.pts[3] = fTriangles[1].p3;
|
q.pts[3] = fTriangles[1].p3;
|
||||||
|
|
||||||
for (int i = 2; i < numTri; i += 2) {
|
for (size_t i = 2; i < numTri; i += 2) {
|
||||||
if ((fTriangles[i-1].p1 == fTriangles[i].p2) &&
|
if ((fTriangles[i - 1].p1 == fTriangles[i].p2) &&
|
||||||
(fTriangles[i-1].p3 == fTriangles[i].p3)) {
|
(fTriangles[i - 1].p3 == fTriangles[i].p3)) {
|
||||||
q.pts[q.numpts++] = fTriangles[i+1].p1;
|
q.pts[q.numpts++] = fTriangles[i + 1].p1;
|
||||||
q.pts[q.numpts++] = fTriangles[i+1].p3;
|
q.pts[q.numpts++] = fTriangles[i + 1].p3;
|
||||||
qpts+=2;
|
qpts+=2;
|
||||||
} else {
|
} else {
|
||||||
int *np = (int*)malloc(sizeof(int)*q.numpts);
|
int *np = (int*)malloc(sizeof(int)*q.numpts);
|
||||||
memcpy(np,qp,q.numpts*sizeof(int));
|
memcpy(np, qp, q.numpts * sizeof(int));
|
||||||
quadStrip nqs;
|
quadStrip nqs;
|
||||||
nqs.numpts = q.numpts;
|
nqs.numpts = q.numpts;
|
||||||
nqs.pts = np;
|
nqs.pts = np;
|
||||||
fQs.add(nqs);
|
fQs.add(nqs);
|
||||||
|
|
||||||
qpts += 4;
|
qpts += 4;
|
||||||
q.numpts = 4;
|
q.numpts = 4;
|
||||||
q.pts[2] = fTriangles[i].p1;
|
q.pts[2] = fTriangles[i].p1;
|
||||||
q.pts[0] = fTriangles[i].p2;
|
q.pts[0] = fTriangles[i].p2;
|
||||||
q.pts[1] = fTriangles[i].p3;
|
q.pts[1] = fTriangles[i].p3;
|
||||||
q.pts[3] = fTriangles[i+1].p3;
|
q.pts[3] = fTriangles[i + 1].p3;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int* np = (int*)malloc(sizeof(int)*q.numpts);
|
int* np = (int*)malloc(sizeof(int)*q.numpts);
|
||||||
memcpy(np,qp,q.numpts*sizeof(int));
|
memcpy(np, qp, q.numpts * sizeof(int));
|
||||||
quadStrip nqs;
|
quadStrip nqs;
|
||||||
nqs.numpts = q.numpts;
|
nqs.numpts = q.numpts;
|
||||||
nqs.pts = np;
|
nqs.pts = np;
|
||||||
fQs.add(nqs);
|
fQs.add(nqs);
|
||||||
|
|
||||||
fclose(f);
|
fStatus = B_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -301,6 +320,13 @@ TriangleObject::~TriangleObject()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
status_t
|
||||||
|
TriangleObject::InitCheck() const
|
||||||
|
{
|
||||||
|
return fStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
TriangleObject::DoDrawing(bool forID)
|
TriangleObject::DoDrawing(bool forID)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ class GLObject {
|
|||||||
void RotateWorldSpace(float rx, float ry);
|
void RotateWorldSpace(float rx, float ry);
|
||||||
virtual void MenuInvoked(BPoint point);
|
virtual void MenuInvoked(BPoint point);
|
||||||
virtual void DoDrawing(bool forID) {};
|
virtual void DoDrawing(bool forID) {};
|
||||||
int Solidity() const;
|
int Solidity() const;
|
||||||
|
|
||||||
float x, y, z;
|
float x, y, z;
|
||||||
Quaternion fRotation;
|
Quaternion fRotation;
|
||||||
@@ -68,11 +68,13 @@ class GLObject {
|
|||||||
|
|
||||||
class TriangleObject : public GLObject {
|
class TriangleObject : public GLObject {
|
||||||
public:
|
public:
|
||||||
TriangleObject(ObjectView* ov, char* filename);
|
TriangleObject(ObjectView* ov);
|
||||||
virtual ~TriangleObject();
|
virtual ~TriangleObject();
|
||||||
|
status_t InitCheck() const;
|
||||||
virtual void DoDrawing(bool forID);
|
virtual void DoDrawing(bool forID);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
status_t fStatus;
|
||||||
BufferArray<point> fPoints;
|
BufferArray<point> fPoints;
|
||||||
BufferArray<tri> fTriangles;
|
BufferArray<tri> fTriangles;
|
||||||
BufferArray<quadStrip> fQs;
|
BufferArray<quadStrip> fQs;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -18,9 +18,8 @@
|
|||||||
|
|
||||||
#include "ObjectView.h"
|
#include "ObjectView.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <Application.h>
|
||||||
#include <stdlib.h>
|
#include <Catalog.h>
|
||||||
|
|
||||||
#include <Cursor.h>
|
#include <Cursor.h>
|
||||||
#include <InterfaceKit.h>
|
#include <InterfaceKit.h>
|
||||||
#include <FindDirectory.h>
|
#include <FindDirectory.h>
|
||||||
@@ -29,8 +28,8 @@
|
|||||||
#include "GLObject.h"
|
#include "GLObject.h"
|
||||||
#include "ResScroll.h"
|
#include "ResScroll.h"
|
||||||
|
|
||||||
#define teapotData "teapot.data"
|
#undef B_TRANSLATE_CONTEXT
|
||||||
char teapotPath[PATH_MAX];
|
#define B_TRANSLATE_CONTEXT "ObjectView"
|
||||||
|
|
||||||
float displayScale = 1.0;
|
float displayScale = 1.0;
|
||||||
float depthOfView = 30.0;
|
float depthOfView = 30.0;
|
||||||
@@ -50,6 +49,9 @@ float red[3] = {1.0, 0.0, 0.0};
|
|||||||
|
|
||||||
float* bgColor = black;
|
float* bgColor = black;
|
||||||
|
|
||||||
|
const char *kNoResourceError = B_TRANSLATE("The Teapot 3D model was "
|
||||||
|
"not found in application resources. "
|
||||||
|
"Please repair the program installation.");
|
||||||
|
|
||||||
struct light {
|
struct light {
|
||||||
float *ambient;
|
float *ambient;
|
||||||
@@ -166,12 +168,18 @@ ObjectView::ObjectView(BRect rect, const char *name, ulong resizingMode,
|
|||||||
quittingSem = create_sem(1, "quitting sem");
|
quittingSem = create_sem(1, "quitting sem");
|
||||||
drawEvent = create_sem(0, "draw event");
|
drawEvent = create_sem(0, "draw event");
|
||||||
|
|
||||||
char findDir[PATH_MAX];
|
TriangleObject *Tri = new TriangleObject(this);
|
||||||
find_directory(B_SYSTEM_DATA_DIRECTORY, -1, true, findDir, PATH_MAX);
|
if (Tri->InitCheck() == B_OK) {
|
||||||
sprintf(teapotPath, "%s/%s", findDir, teapotData);
|
fObjListLock.Lock();
|
||||||
fObjListLock.Lock();
|
fObjects.AddItem(Tri);
|
||||||
fObjects.AddItem(new TriangleObject(this, teapotPath));
|
fObjListLock.Unlock();
|
||||||
fObjListLock.Unlock();
|
} else {
|
||||||
|
BAlert *NoResourceAlert = new BAlert(B_TRANSLATE("Error"),
|
||||||
|
kNoResourceError, B_TRANSLATE("OK"), NULL, NULL,
|
||||||
|
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
|
||||||
|
NoResourceAlert->Go();
|
||||||
|
delete Tri;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -304,12 +312,23 @@ ObjectView::MessageReceived(BMessage* msg)
|
|||||||
fForceRedraw = true;
|
fForceRedraw = true;
|
||||||
setEvent(drawEvent);
|
setEvent(drawEvent);
|
||||||
break;
|
break;
|
||||||
case kMsgAddModel:
|
case kMsgAddModel:
|
||||||
fObjListLock.Lock();
|
{
|
||||||
fObjects.AddItem(new TriangleObject(this, teapotPath));
|
TriangleObject *Tri = new TriangleObject(this);
|
||||||
fObjListLock.Unlock();
|
if (Tri->InitCheck() == B_OK) {
|
||||||
|
fObjListLock.Lock();
|
||||||
|
fObjects.AddItem(Tri);
|
||||||
|
fObjListLock.Unlock();
|
||||||
|
} else {
|
||||||
|
BAlert *NoResourceAlert = new BAlert(B_TRANSLATE("Error"),
|
||||||
|
kNoResourceError, B_TRANSLATE("OK"), NULL, NULL,
|
||||||
|
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
|
||||||
|
NoResourceAlert->Go();
|
||||||
|
delete Tri;
|
||||||
|
}
|
||||||
setEvent(drawEvent);
|
setEvent(drawEvent);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case kMsgLights:
|
case kMsgLights:
|
||||||
{
|
{
|
||||||
msg->FindPointer("source", reinterpret_cast<void**>(&item));
|
msg->FindPointer("source", reinterpret_cast<void**>(&item));
|
||||||
|
|||||||
Reference in New Issue
Block a user