From cde789fb6cfd64f3e1cc719ad2602c843258aa07 Mon Sep 17 00:00:00 2001
From: Pavel
Date: Sun, 12 Jan 2020 22:38:00 +0300
Subject: [PATCH] Computer graphics lab with tajmahal
https://github.com/math10/Computer-Graphics-lab
---
Computer-Graphics-lab-master/.gitattributes | 17 +
Computer-Graphics-lab-master/.gitignore | 43 ++
.../Tajmahal_cg/Tajmahal_cg.cbp | 51 ++
.../Tajmahal_cg/Tajmahal_cg.depend | 250 ++++++++
.../Tajmahal_cg/Tajmahal_cg.layout | 7 +
.../Tajmahal_cg/color.h | 111 ++++
.../Tajmahal_cg/imageloader.h | 221 +++++++
.../Tajmahal_cg/main.cpp | 602 ++++++++++++++++++
.../Tajmahal_cg/obj/Debug/main.o | Bin 0 -> 76592 bytes
.../Tajmahal_cg/vec3f.h | 163 +++++
10 files changed, 1465 insertions(+)
create mode 100644 Computer-Graphics-lab-master/.gitattributes
create mode 100644 Computer-Graphics-lab-master/.gitignore
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.cbp
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.depend
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.layout
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/color.h
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/imageloader.h
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/main.cpp
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/obj/Debug/main.o
create mode 100644 Computer-Graphics-lab-master/Tajmahal_cg/vec3f.h
diff --git a/Computer-Graphics-lab-master/.gitattributes b/Computer-Graphics-lab-master/.gitattributes
new file mode 100644
index 0000000..bdb0cab
--- /dev/null
+++ b/Computer-Graphics-lab-master/.gitattributes
@@ -0,0 +1,17 @@
+# Auto detect text files and perform LF normalization
+* text=auto
+
+# Custom for Visual Studio
+*.cs diff=csharp
+
+# Standard to msysgit
+*.doc diff=astextplain
+*.DOC diff=astextplain
+*.docx diff=astextplain
+*.DOCX diff=astextplain
+*.dot diff=astextplain
+*.DOT diff=astextplain
+*.pdf diff=astextplain
+*.PDF diff=astextplain
+*.rtf diff=astextplain
+*.RTF diff=astextplain
diff --git a/Computer-Graphics-lab-master/.gitignore b/Computer-Graphics-lab-master/.gitignore
new file mode 100644
index 0000000..96374c4
--- /dev/null
+++ b/Computer-Graphics-lab-master/.gitignore
@@ -0,0 +1,43 @@
+# Windows image file caches
+Thumbs.db
+ehthumbs.db
+
+# Folder config file
+Desktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+# =========================
+# Operating System Files
+# =========================
+
+# OSX
+# =========================
+
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Thumbnails
+._*
+
+# Files that might appear on external disk
+.Spotlight-V100
+.Trashes
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.cbp b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.cbp
new file mode 100644
index 0000000..1661cd4
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.cbp
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.depend b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.depend
new file mode 100644
index 0000000..4dbddff
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.depend
@@ -0,0 +1,250 @@
+# depslib dependency file v1.0
+1441643058 source:c:\users\sanim\desktop\thesis\tajmahal_cg\main.cpp
+
+
+ "imageloader.h"
+ "color.h"
+
+1434386397 c:\program files\codeblocks-ep\mingw\include\gl\glut.h
+
+
+
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\windows.h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winresrc.h
+
+
+
+
+
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winuser.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winnt.h
+
+
+
+
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winerror.h
+
+1259406758 c:\program files\codeblocks-ep\mingw\include\string.h
+ <_mingw.h>
+
+
+1259406752 c:\program files\codeblocks-ep\mingw\include\_mingw.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\basetsd.h
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\pshpack4.h
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\poppack.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winver.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\dde.h
+
+1258799504 c:\program files\codeblocks-ep\mingw\include\dlgs.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\commctrl.h
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\prsht.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\windef.h
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\wincon.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winbase.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\wingdi.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winnls.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winnetwk.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winreg.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winsvc.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\cderr.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\ddeml.h
+
+1258799504 c:\program files\codeblocks-ep\mingw\include\imm.h
+
+1258799508 c:\program files\codeblocks-ep\mingw\include\lzexpand.h
+
+1258799508 c:\program files\codeblocks-ep\mingw\include\mmsystem.h
+
+1258799508 c:\program files\codeblocks-ep\mingw\include\nb30.h
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpc.h
+
+
+
+
+
+
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcdce.h
+
+
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\basetyps.h
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcdcep.h
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcnsi.h
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcnterr.h
+
+1259406754 c:\program files\codeblocks-ep\mingw\include\excpt.h
+ <_mingw.h>
+
+
+1258799514 c:\program files\codeblocks-ep\mingw\include\shellapi.h
+
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\pshpack2.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winperf.h
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\commdlg.h
+
+
+
+1258799514 c:\program files\codeblocks-ep\mingw\include\unknwn.h
+
+
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\objfwd.h
+
+
+1258799518 c:\program files\codeblocks-ep\mingw\include\wtypes.h
+
+
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcndr.h
+
+
+
+1258799512 c:\program files\codeblocks-ep\mingw\include\rpcnsip.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winspool.h
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winsock2.h
+
+
+1258799516 c:\program files\codeblocks-ep\mingw\include\winsock.h
+
+
+
+1258799508 c:\program files\codeblocks-ep\mingw\include\mswsock.h
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\ole2.h
+
+
+
+
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\objbase.h
+
+
+
+
+
+
+
+
+
+1259406758 c:\program files\codeblocks-ep\mingw\include\stdlib.h
+ <_mingw.h>
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\objidl.h
+
+
+1258799502 c:\program files\codeblocks-ep\mingw\include\cguid.h
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\olectlid.h
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\oleauto.h
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\oaidl.h
+
+
+
+1258799510 c:\program files\codeblocks-ep\mingw\include\oleidl.h
+
+
+1258799518 c:\program files\codeblocks-ep\mingw\include\gl\gl.h
+
+1258799518 c:\program files\codeblocks-ep\mingw\include\gl\glu.h
+
+
+
+1259406756 c:\program files\codeblocks-ep\mingw\include\stdio.h
+ <_mingw.h>
+
+
+
+
+1259406760 c:\program files\codeblocks-ep\mingw\include\sys\types.h
+ <_mingw.h>
+
+
+1259406756 c:\program files\codeblocks-ep\mingw\include\math.h
+ <_mingw.h>
+
+1441554913 c:\users\sanim\desktop\thesis\tajmahal_cg\imageloader.h
+
+
+
+1259406752 c:\program files\codeblocks-ep\mingw\include\assert.h
+ <_mingw.h>
+
+1439186349 c:\users\sanim\desktop\thesis\tajmahal_cg\vec3f.h
+
+
+ "vec3f.h"
+
+1374680643 c:\users\sanim\desktop\thesis\tajmahal_cg\color.h
+
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.layout b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.layout
new file mode 100644
index 0000000..d3dd98f
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/Tajmahal_cg.layout
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/color.h b/Computer-Graphics-lab-master/Tajmahal_cg/color.h
new file mode 100644
index 0000000..7d75929
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/color.h
@@ -0,0 +1,111 @@
+#define Red 1.0,0.0,0.0
+#define Green 0.0,1.0,0.0
+#define Blue 0.0,0.0,1.0
+#define Yellow 1.0,1.0,0.0
+#define Cyan 0.0,1.0,1.0
+#define Magenta 1.0,0.0,1.0
+#define White 1.0,1.0,1.0
+#define Black 0.0,0.0,0.0
+
+#define GoldPole 0.627451,0.627451,0
+
+#define DimGray 0.329412,0.329412,0.329412
+#define Gray 0.752941,0.752941,0.752941
+#define LightGray 0.658824,0.658824,0.658824
+#define VLightGray 0.80,0.80,0.80
+
+#define Aquamarine 0.439216,0.858824,0.576471
+#define BlueViolet 0.62352,0.372549,0.623529
+#define Brown 0.647059,0.164706,0.164706
+#define CadetBlue 0.372549,0.623529,0.623529
+#define Coral 1.0,0.498039,0.0
+#define CornflowerBlue 0.258824,0.258824,0.435294
+#define DarkGreen 0.184314,0.309804,0.184314
+#define DarkOliveGreen 0.309804,0.309804,0.184314
+#define DarkOrchid 0.6,0.196078,0.8
+#define DarkSlateBlue 0.419608,0.137255,0.556863
+#define DarkSlateGray 0.184314,0.309804,0.309804
+#define DarkSlateGrey 0.184314,0.309804,0.309804
+#define DarkTurquoise 0.439216,0.576471,0.858824
+#define Firebrick 0.556863,0.137255,0.137255
+#define ForestGreen 0.137255,0.556863,0.137255
+#define Gold 0.8,0.498039,0.196078
+#define Goldenrod 0.858824,0.858824,0.439216
+#define GreenYellow 0.576471,0.858824,0.439216
+#define IndianRed 0.309804,0.184314,0.184314
+#define Khaki 0.623529,0.623529,0.372549
+#define LightBlue 0.74902,0.847059,0.847059
+#define LightSteelBlue 0.560784,0.560784,0.737255
+#define LimeGreen 0.196078,0.8,0.196078
+#define Maroon 0.556863,0.137255,0.419608
+#define MediumAquamarine 0.196078,0.8,0.6
+#define MediumBlue 0.196078,0.196078,0.8
+#define MediumForestGreen 0.419608,0.556863,0.137255
+#define MediumGoldenrod 0.917647,0.917647,0.678431
+#define MediumOrchid 0.576471,0.439216,0.858824
+#define MediumSeaGreen 0.258824,0.435294,0.258824
+#define MediumSlateBlue 0.498039,1.0
+#define MediumSpringGreen 0.498039,1.0
+#define MediumTurquoise 0.439216,0.858824,0.858824
+#define MediumVioletRed 0.858824,0.439216,0.576471
+#define MidnightBlue 0.184314,0.184314,0.309804
+#define Navy 0.137255,0.137255,0.556863
+#define NavyBlue 0.137255,0.137255,0.556863
+#define Orange 1,0.5,0.0
+#define OrangeRed 1.0,0.25
+#define Orchid 0.858824,0.439216,0.858824
+#define PaleGreen 0.560784,0.737255,0.560784
+#define Pink 0.737255,0.560784,0.560784
+#define Plum 0.917647,0.678431,0.917647
+#define Salmon 0.435294,0.258824,0.258824
+#define SeaGreen 0.137255,0.556863,0.419608
+#define Sienna 0.556863,0.419608,0.137255
+#define SkyBlue 0.196078,0.6,0.8
+#define SlateBlue = color,0.498039,1.0
+#define SpringGreen = color,1.0,0.498039
+#define SteelBlue 0.137255,0.419608,0.556863
+#define Tan 0.858824,0.576471,0.439216
+#define Thistle 0.847059,0.74902,0.847059
+#define Turquoise 0.678431,0.917647,0.917647
+#define Violet 0.309804,0.184314,0.309804
+#define VioletRed 0.8,0.196078,0.6
+#define Wheat 0.847059,0.847059,0.74902
+#define YellowGreen 0.6,0.8,0.196078
+#define SummerSky 0.22,0.69,0.87
+#define RichBlue 0.35,0.35,0.67
+#define Brass 0.71,0.65,0.26
+#define Copper 0.72,0.45,0.20
+#define Bronze 0.55,0.47,0.14
+#define Bronze2 0.65,0.49,0.24
+#define Silver 0.90,0.91,0.98
+#define BrightGold 0.85,0.85,0.10
+#define OldGold 0.81,0.71,0.23
+#define Feldspar 0.82,0.57,0.46
+#define Quartz 0.85,0.85,0.95
+// #define Mica = color Black // needed in textures.inc
+#define NeonPink 1.00,0.43,0.78
+#define DarkPurple 0.53,0.12,0.47
+#define NeonBlue 0.30,0.30,1.00
+#define CoolCopper 0.85,0.53,0.10
+#define MandarinOrange 0.89,0.47,0.20
+#define LightWood 0.91,0.76,0.65
+#define MediumWood 0.65,0.50,0.39
+#define DarkWood 0.52,0.37,0.26
+#define SpicyPink 1.00,0.11,0.68
+#define SemiSweetChoc 0.42,0.26,0.15
+#define BakersChoc 0.36,0.20,0.09
+#define Flesh 0.96,0.80,0.69
+#define NewTan 0.92,0.78,0.62
+#define NewMidnightBlue 0.00,0.00,0.61
+#define VeryDarkBrown 0.35,0.16,0.14
+#define DarkBrown 0.36,0.25,0.20
+#define DarkTan 0.59,0.41,0.31
+#define GreenCopper 0.32,0.49,0.46
+#define DkGreenCopper 0.29,0.46,0.43
+#define DustyRose 0.52,0.39,0.39
+#define HuntersGreen 0.13,0.37,0.31
+#define Scarlet 0.55,0.09,0.09
+
+#define MedPurple 0.73,0.16,0.96
+#define LightPurple 0.87,0.58,0.98
+#define VeryLightPurple 0.94,0.81,0.99
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/imageloader.h b/Computer-Graphics-lab-master/Tajmahal_cg/imageloader.h
new file mode 100644
index 0000000..53e77f1
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/imageloader.h
@@ -0,0 +1,221 @@
+/* Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to deal
+ * in the Software without restriction, including without limitation the rights
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ * copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above notice and this permission notice shall be included in all copies
+ * or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+/* File for "Terrain" lesson of the OpenGL tutorial on
+ * www.videotutorialsrock.com
+ */
+
+
+
+#ifndef IMAGE_LOADER_H_INCLUDED
+#define IMAGE_LOADER_H_INCLUDED
+#include
+#include
+
+using namespace std;
+//Represents an image
+class Image {
+ public:
+ Image(char* ps, int w, int h);
+ ~Image();
+
+ /* An array of the form (R1, G1, B1, R2, G2, B2, ...) indicating the
+ * color of each pixel in image. Color components range from 0 to 255.
+ * The array starts the bottom-left pixel, then moves right to the end
+ * of the row, then moves up to the next column, and so on. This is the
+ * format in which OpenGL likes images.
+ */
+ char* pixels;
+ int width;
+ int height;
+};
+
+
+
+Image::Image(char* ps, int w, int h) : pixels(ps), width(w), height(h) {
+
+}
+
+Image::~Image() {
+ delete[] pixels;
+}
+
+namespace {
+ //Converts a four-character array to an integer, using little-endian form
+ int toInt(const char* bytes) {
+ return (int)(((unsigned char)bytes[3] << 24) |
+ ((unsigned char)bytes[2] << 16) |
+ ((unsigned char)bytes[1] << 8) |
+ (unsigned char)bytes[0]);
+ }
+
+ //Converts a two-character array to a short, using little-endian form
+ short toShort(const char* bytes) {
+ return (short)(((unsigned char)bytes[1] << 8) |
+ (unsigned char)bytes[0]);
+ }
+
+ //Reads the next four bytes as an integer, using little-endian form
+ int readInt(ifstream &input) {
+ char buffer[4];
+ input.read(buffer, 4);
+ return toInt(buffer);
+ }
+
+ //Reads the next two bytes as a short, using little-endian form
+ short readShort(ifstream &input) {
+ char buffer[2];
+ input.read(buffer, 2);
+ return toShort(buffer);
+ }
+
+ //Just like auto_ptr, but for arrays
+ template
+ class auto_array {
+ private:
+ T* array;
+ mutable bool isReleased;
+ public:
+ explicit auto_array(T* array_ = NULL) :
+ array(array_), isReleased(false) {
+ }
+
+ auto_array(const auto_array &aarray) {
+ array = aarray.array;
+ isReleased = aarray.isReleased;
+ aarray.isReleased = true;
+ }
+
+ ~auto_array() {
+ if (!isReleased && array != NULL) {
+ delete[] array;
+ }
+ }
+
+ T* get() const {
+ return array;
+ }
+
+ T &operator*() const {
+ return *array;
+ }
+
+ void operator=(const auto_array &aarray) {
+ if (!isReleased && array != NULL) {
+ delete[] array;
+ }
+ array = aarray.array;
+ isReleased = aarray.isReleased;
+ aarray.isReleased = true;
+ }
+
+ T* operator->() const {
+ return array;
+ }
+
+ T* release() {
+ isReleased = true;
+ return array;
+ }
+
+ void reset(T* array_ = NULL) {
+ if (!isReleased && array != NULL) {
+ delete[] array;
+ }
+ array = array_;
+ }
+
+ T* operator+(int i) {
+ return array + i;
+ }
+
+ T &operator[](int i) {
+ return array[i];
+ }
+ };
+}
+
+Image* loadBMP(const char* filename) {
+ ifstream input;
+ input.open(filename, ifstream::binary);
+ assert(!input.fail() || !"Could not find file");
+ char buffer[2];
+ input.read(buffer, 2);
+ assert(buffer[0] == 'B' && buffer[1] == 'M' || !"Not a bitmap file");
+ input.ignore(8);
+ int dataOffset = readInt(input);
+
+ //Read the header
+ int headerSize = readInt(input);
+ int width;
+ int height;
+ switch(headerSize) {
+ case 40:
+ //V3
+ width = readInt(input);
+ height = readInt(input);
+ input.ignore(2);
+ assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
+ assert(readShort(input) == 0 || !"Image is compressed");
+ break;
+ case 12:
+ //OS/2 V1
+ width = readShort(input);
+ height = readShort(input);
+ input.ignore(2);
+ assert(readShort(input) == 24 || !"Image is not 24 bits per pixel");
+ break;
+ case 64:
+ //OS/2 V2
+ assert(!"Can't load OS/2 V2 bitmaps");
+ break;
+ case 108:
+ //Windows V4
+ assert(!"Can't load Windows V4 bitmaps");
+ break;
+ case 124:
+ //Windows V5
+ assert(!"Can't load Windows V5 bitmaps");
+ break;
+ default:
+ assert(!"Unknown bitmap format");
+ }
+
+ //Read the data
+ int bytesPerRow = ((width * 3 + 3) / 4) * 4 - (width * 3 % 4);
+ int size = bytesPerRow * height;
+ auto_array pixels(new char[size]);
+ input.seekg(dataOffset, ios_base::beg);
+ input.read(pixels.get(), size);
+ //cout << height << " " << width << endl;
+
+ //Get the data into the right format
+ auto_array pixels2(new char[width * height * 3]);
+ for(int y = 0; y < height; y++) {
+ for(int x = 0; x < width; x++) {
+ for(int c = 0; c < 3; c++) {
+ pixels2[3 * (width * y + x) + c] =
+ pixels[bytesPerRow * y + 3 * x + (2 - c)];
+ }
+ }
+ }
+
+ input.close();
+ return new Image(pixels2.release(), width, height);
+}
+#endif
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/main.cpp b/Computer-Graphics-lab-master/Tajmahal_cg/main.cpp
new file mode 100644
index 0000000..fc3797b
--- /dev/null
+++ b/Computer-Graphics-lab-master/Tajmahal_cg/main.cpp
@@ -0,0 +1,602 @@
+
+/*
+Author :: MD. Musfiqur Rahman Sanim
+Aust cse 28th Batch
+ID:11.02.04.097
+*/
+
+
+//{ Template
+using namespace std;
+//{ headers
+#include
+//}
+//{ Loops
+#define forab(i,a,b) for (__typeof(b) i = (a); i <= (b); ++i)
+#define rep(i,n) forab (i, 0, (n) - 1)
+#define For(i,n) forab (i, 1, n)
+#define rofba(i,a,b) for (__typeof(b) i = (b); i >= (a); --i)
+#define per(i,n) rofba (i, 0, (n) - 1)
+#define rof(i,n) rofba (i, 1, n)
+#define forstl(i,s) for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)
+//}
+//{ Floating-points
+#define EPS 1e-7
+#define abs(x) (((x) < 0) ? - (x) : (x))
+#define zero(x) (abs (x) < EPS)
+#define equal(a,b) (zero ((a) - (b)))
+#define PI 2*acos (0.0)
+//}
+typedef long long int64;
+typedef unsigned long long int64u;
+#define memo(a,v) memset(a,v,sizeof(a))
+#define all(a) a.begin(),a.end()
+#define db double
+#define pb push_back
+#define eb emplace_back
+#define pii pair
+#define NL puts("")
+#define ff first
+#define ss second
+//{
+//Intput_Output
+#define gc getchar
+#define II ({ int a; read(a); a;})
+#define IL ({ int64 a; read(a); a;})
+#define ID ({ db a; scanf("%lf",&a); a;})
+#define IC ({ char a; scanf("%c",&a); a;})
+#define IS ({ string a; cin >> a; a;})
+#define OC printf("Case %d:",cs);
+//}
+//}
+#define _stl(x) {__stl_print__(x);}
+#define __(args...) {dbg,args; cerr<inline bool read(T &x){int c=gc();int sgn=1;while(~c&&c<'0'|c>'9'){if(c=='-')sgn=-1;c=gc();}for(x=0;~c&&'0'<=c&&c<='9';c=gc())x=x*10+c-'0';x*=sgn;return ~c;}
+struct debugger{template debugger& operator , (const T& v){cerr< void __stl_print__ (T &x) { // for all STL containers
+ cerr << "["; forstl (i, x) cerr << (i != x.begin () ? ", " : "") << *i; cerr << "]" << endl;
+}
+template inline T max (T &a, U &b)
+{
+ return a > b ? a : b;
+}
+template inline T min (T &a, U &b)
+{
+ return a < b ? a : b;
+}
+template inline T swap (T &a, U &b)
+{
+ T tmp = a;
+ a = b;
+ b = tmp;
+}
+
+
+#include
+#include "imageloader.h"
+#include "color.h"
+
+using namespace std;
+
+const float BOX_SIZE = 15.0f;
+const float h = 1.f; //The length of each side of the cube
+float _angle = 0; //The rotation of the box
+GLuint _textureId,_textureId1,_textureId2,_textureId3; //The OpenGL id of the texture
+GLUquadricObj *quad = gluNewQuadric();
+GLUquadricObj *quad1 = gluNewQuadric();
+void handleKeypress(unsigned char key, int x, int y) {
+ switch (key) {
+ case 27: //Escape key
+ exit(0);
+ }
+}
+
+//Makes the image into a texture, and returns the id of the texture
+GLuint loadTexture(Image* image) {
+ GLuint textureId;
+ glGenTextures(1, &textureId);
+ glBindTexture(GL_TEXTURE_2D, textureId);
+ glTexImage2D(GL_TEXTURE_2D,
+ 0,
+ GL_RGB,
+ image->width, image->height,
+ 0,
+ GL_RGB,
+ GL_UNSIGNED_BYTE,
+ image->pixels);
+ return textureId;
+}
+
+void initRendering() {
+ glEnable(GL_DEPTH_TEST);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_NORMALIZE);
+ glEnable(GL_COLOR_MATERIAL);
+
+ Image* image = loadBMP("C:\\Users\\Sanim\\Desktop\\thesis\\Tajmahal_cg\\1.bmp");
+ _textureId = loadTexture(image);
+ delete image;
+
+ image = loadBMP("C:\\Users\\Sanim\\Desktop\\thesis\\Tajmahal_cg\\2.bmp");
+ _textureId1 = loadTexture(image);
+ delete image;
+
+ image = loadBMP("C:\\Users\\Sanim\\Desktop\\thesis\\Tajmahal_cg\\3.bmp");
+ _textureId2 = loadTexture(image);
+ delete image;
+
+ image = loadBMP("C:\\Users\\Sanim\\Desktop\\thesis\\Tajmahal_cg\\4.bmp");
+ _textureId3 = loadTexture(image);
+ delete image;
+
+ //Image* image = loadBMP("aust.bmp");
+ //_textureId = loadTexture(image);
+ //delete image;
+}
+
+void handleResize(int w, int h) {
+ glViewport(0, 0, w, h);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(45.0, (float)w / (float)h, 1.0, 200.0);
+}
+
+void TajFloor() {
+ glColor3d(White);
+ glBegin(GL_QUADS);
+ //Top face
+ glNormal3f(0.0, 1.0f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+
+ //Bottom face
+
+ glNormal3f(0.0, -1.0f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+
+ //Left face
+ glNormal3f(-1.0, 0.0f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+
+ //Right face
+ glNormal3f(1.0, 0.0f, 0.0f);
+ glVertex3f(BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+
+
+
+ //Front face
+ glNormal3f(0.0, 0.0f, 1.0f);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, -h / 2, BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, h / 2, BOX_SIZE / 2);
+
+ //Back face
+ glNormal3f(0.0, 0.0f, -1.0f);
+ glVertex3f(-BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glVertex3f(-BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, h / 2, -BOX_SIZE / 2);
+ glVertex3f(BOX_SIZE / 2, -h / 2, -BOX_SIZE / 2);
+ glEnd();
+}
+
+void minarCenterCylinder(float a,float b) {
+ glEnable(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, _textureId3);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ glPushMatrix();
+ glTranslated(a,0.0,b);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.8,0.6,7,8,1);
+ glPopMatrix();
+}
+
+void minarRings(float a,float b,float c) {
+ glPushMatrix();
+ glTranslated(a,c,b);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.9,0.9,.25,8,1);
+ gluDisk(quad,0,0.9,50,1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(a,c+.25,b);
+ glRotated(90.,-1.,0.,0.);
+ gluDisk(quad,0,0.9,50,1);
+ glPopMatrix();
+}
+
+void minarHead(float a,float b) {
+ glEnable(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, _textureId2);
+ gluQuadricOrientation(quad1, GLU_OUTSIDE);
+ gluQuadricNormals(quad1, true);
+ gluQuadricTexture(quad1, true);
+ glPushMatrix();
+ glTranslated(a,7,b);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad1,0.6,0.6,1.25,8,1);
+ glPopMatrix();
+
+
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ glPushMatrix();
+ glTranslated(a,8.25,b);
+ glRotated(90.,-1.,0.,0.);
+ gluDisk(quad,0,0.6,50,1);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(a,8.25,b);
+ glRotated(90.,-1.,0.,0.);
+ glutSolidSphere(0.6,50,50);
+ glPopMatrix();
+
+ glBindTexture(GL_TEXTURE_2D, _textureId3);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ glPushMatrix();
+ glTranslated(a,8,b);
+ glRotated(90.,-1.,0.,0.);
+ glutSolidCone(0.9,.25,50,50);
+ gluDisk(quad,0,0.9,50,1);
+ glPopMatrix();
+
+ glBindTexture(GL_TEXTURE_2D, _textureId3);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ glPushMatrix();
+ glColor3d(Gold);
+ glTranslated(a,8.25+.6,b);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.1,0.1,.25,8,1);
+ glPopMatrix();
+ glColor3d(White);
+}
+
+
+void minar() {
+
+ minarCenterCylinder(BOX_SIZE/2-.8,BOX_SIZE/2-.8);
+ minarRings(BOX_SIZE/2-.8,BOX_SIZE/2-.8,2.33);
+ minarRings(BOX_SIZE/2-.8,BOX_SIZE/2-.8,2.33*2);
+ minarRings(BOX_SIZE/2-.8,BOX_SIZE/2-.8,2.33*3);
+ minarHead(BOX_SIZE/2-.8,BOX_SIZE/2-.8);
+
+
+ minarCenterCylinder(-BOX_SIZE/2+.8,BOX_SIZE/2-.8);
+ minarRings(-BOX_SIZE/2+.8,BOX_SIZE/2-.8,2.33);
+ minarRings(-BOX_SIZE/2+.8,BOX_SIZE/2-.8,2.33*2);
+ minarRings(-BOX_SIZE/2+.8,BOX_SIZE/2-.8,2.33*3);
+ minarHead(-BOX_SIZE/2+.8,BOX_SIZE/2-.8);
+
+ minarCenterCylinder(-BOX_SIZE/2+.8,-BOX_SIZE/2+.8);
+ minarRings(-BOX_SIZE/2+.8,-BOX_SIZE/2+.8,2.33);
+ minarRings(-BOX_SIZE/2+.8,-BOX_SIZE/2+.8,2.33*2);
+ minarRings(-BOX_SIZE/2+.8,-BOX_SIZE/2+.8,2.33*3);
+ minarHead(-BOX_SIZE/2+.8,-BOX_SIZE/2+.8);
+
+ minarCenterCylinder(BOX_SIZE/2-.8,-BOX_SIZE/2+.8);
+ minarRings(BOX_SIZE/2-.8,-BOX_SIZE/2+.8,2.33);
+ minarRings(BOX_SIZE/2-.8,-BOX_SIZE/2+.8,2.33*2);
+ minarRings(BOX_SIZE/2-.8,-BOX_SIZE/2+.8,2.33*3);
+ minarHead(BOX_SIZE/2-.8,-BOX_SIZE/2+.8);
+
+}
+double x = 6,y = 6;
+void wall1() {
+
+ glEnable(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, _textureId);
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, 1.0f, 0.0f);
+ glTexCoord2f(0.f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2 + x, h / 2 , BOX_SIZE / 2 - x);
+ glTexCoord2f(1.f, 0.f);
+ glVertex3f(-BOX_SIZE / 2 + x, h / 2 + y-1, BOX_SIZE / 2 - x);
+ glTexCoord2f(1.f, 1.f);
+ glVertex3f(BOX_SIZE / 2 - x, h / 2 + y-1, BOX_SIZE / 2 - x);
+ glTexCoord2f(0.f, 1.f);
+ glVertex3f(BOX_SIZE / 2 - x, h / 2, BOX_SIZE / 2 - x);
+ glEnd();
+
+ glPushMatrix();
+ glTranslated(-BOX_SIZE / 2 + x+.1, h / 2+ y-1 , BOX_SIZE / 2 - x);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(BOX_SIZE / 2 - x-.1, h / 2 + y-1, BOX_SIZE / 2 - x);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+}
+double z = 2;
+double _w2;
+void wall2() {
+ glEnable(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glBindTexture(GL_TEXTURE_2D, _textureId1);
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, 1.0f, 0.0f);
+ glTexCoord2f(0.f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2 + x, h / 2 , BOX_SIZE / 2 - x);
+
+ glTexCoord2f(1.f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2 + x, h / 2 + y - z, BOX_SIZE / 2 - x);
+
+ glTexCoord2f(1.f, 1.0f);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2 + y - z, BOX_SIZE / 2 - x);
+ //__(-BOX_SIZE / 2 + .75*x, h / 2 + y - z, BOX_SIZE / 2 - x);
+
+ glTexCoord2f(0.f, 1.0f);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2, BOX_SIZE / 2 - x);
+ glEnd();
+}
+
+void wall3() {
+
+ glBindTexture(GL_TEXTURE_2D, _textureId1);
+ glBegin(GL_QUADS);
+ glNormal3f(0.0, 1.0f, 0.0f);
+
+ glTexCoord2f(0.f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2, BOX_SIZE / 2 - x);
+
+ glTexCoord2f(1.f, 0.0f);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2 + y - z, BOX_SIZE / 2 - x);
+
+ glTexCoord2f(1.f, 1.0f);
+ glVertex3f(-BOX_SIZE / 3.25 , h / 2 + y - z, BOX_SIZE / 2 - 1.25*x);
+
+
+ glTexCoord2f(0.f, 1.0f);
+ glVertex3f(-BOX_SIZE / 3.25, h / 2 , BOX_SIZE / 2 - 1.25*x);
+
+ glEnd();
+
+ glPushMatrix();
+ glTranslated(-BOX_SIZE / 2 + .75*x, h / 2 + y - z, BOX_SIZE / 2 - x-.1);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(-BOX_SIZE / 3.25 , h / 2 + y - z, BOX_SIZE / 2 - 1.25*x-.1);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+}
+
+void centerBig(){
+ glPushMatrix();
+ glTranslated(0,5,-BOX_SIZE/5);
+ gluSphere(quad,2,50,50);
+ glBindTexture(GL_TEXTURE_2D, _textureId3);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ glTranslated(0,2,0);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+}
+
+void side(){
+
+ glPushMatrix();
+ glTranslated(-3,4.75,-BOX_SIZE/2.75);
+ gluSphere(quad,1,50,50);
+ glTranslated(0,1,0);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.50,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(BOX_SIZE/2.75,0,0);
+ glTranslated(-3,4.75,-BOX_SIZE/2.75);
+ gluSphere(quad,1,50,50);
+ glTranslated(0,1,0);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.25,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(0,0,BOX_SIZE/2.75);
+ glTranslated(-3,4.75,-BOX_SIZE/2.75);
+ gluSphere(quad,1,50,50);
+ glTranslated(0,1,0);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.25,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+ glPushMatrix();
+ glTranslated(BOX_SIZE/2.75,0,BOX_SIZE/2.75);
+ glTranslated(-3,4.75,-BOX_SIZE/2.75);
+ gluSphere(quad,1,50,50);
+ glTranslated(0,1,0);
+ glColor3d(Gold);
+ glRotated(90.,-1.,0.,0.);
+ gluCylinder(quad,0.05,0.05,.25,8,1);
+ glColor3d(White);
+ glPopMatrix();
+
+
+}
+
+
+void house() {
+
+ glPushMatrix();
+ glTranslated(0,0,2);
+ wall1();
+ wall2();
+ glPushMatrix();
+ glTranslated(BOX_SIZE/3.35,0,0);
+ wall2();
+ glPopMatrix();
+
+ glPushMatrix();
+ wall3();
+ glPopMatrix();
+
+ glPushMatrix();
+ rep(i,3) {
+ glTranslated(-3,0,-3);
+ glRotated(-90.,0,1,0);
+ wall1();
+ wall2();
+ glPushMatrix();
+ glTranslated(BOX_SIZE/3.35,0,0);
+ wall2();
+ glPopMatrix();
+ wall3();
+ }
+ glPopMatrix();
+ glBindTexture(GL_TEXTURE_2D, _textureId3);
+ gluQuadricOrientation(quad, GLU_OUTSIDE);
+ gluQuadricNormals(quad, true);
+ gluQuadricTexture(quad, true);
+ centerBig();
+ side();
+ glPopMatrix();
+
+}
+
+void dd(){
+ glPushMatrix();
+ glBegin(GL_QUADS);
+ glVertex3f(-BOX_SIZE/3.35 , h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE / 3.35, h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE/3.35, h / 2 + y - z, -BOX_SIZE / 3.5);
+ glVertex3f(-BOX_SIZE/3.35 , h / 2 + y - z, -BOX_SIZE /3.5);
+ glEnd();
+
+ glBegin(GL_QUADS);
+ glVertex3f(-BOX_SIZE/3.35 , h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE / 3.35, h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE / 2 - .75*x, h / 2 + y - z, BOX_SIZE / 4.35);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2 + y - z , BOX_SIZE / 4.35);
+ glEnd();
+
+ glPushMatrix();
+
+ glTranslated(0,0,-BOX_SIZE/8);
+ glRotated(-180,0,1,0);
+ glBegin(GL_QUADS);
+ glVertex3f(-BOX_SIZE/3.35 , h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE / 3.35, h / 2 + y - z, BOX_SIZE / 6.45);
+ glVertex3f(BOX_SIZE / 2 - .75*x, h / 2 + y - z, BOX_SIZE / 4.35);
+ glVertex3f(-BOX_SIZE / 2 + .75*x, h / 2 + y - z , BOX_SIZE / 4.35);
+ glEnd();
+ glPopMatrix();
+
+ glPopMatrix();
+}
+
+void front(){
+
+}
+
+void drawScene() {
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+
+ glTranslatef(0.0f, 0.0f, -40.0f);
+
+ GLfloat ambientLight[] = {0.3f, 0.3f, 0.3f, 1.0f};
+ glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight);
+
+ GLfloat lightColor[] = {0.7f, 0.7f, 0.7f, 1.0f};
+ GLfloat lightPos[] = {-2 * BOX_SIZE, BOX_SIZE, 4 * BOX_SIZE, 1.0f};
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor);
+ glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
+
+ glEnable(GL_TEXTURE_2D);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glRotatef(-_angle, 0.0f, 1.0f, 0.0f);
+ TajFloor();
+ minar();
+ house();
+ dd();
+
+ glutSwapBuffers();
+}
+
+
+void update(int value) {
+ _angle += 1.0f;
+ if (_angle > 360) {
+ _angle -= 360;
+ }
+ glutPostRedisplay();
+ glutTimerFunc(10, update, 0);
+}
+
+
+int main(int argc, char** argv) {
+ glutInit(&argc, argv);
+ glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
+ glutInitWindowSize(800, 800);
+
+ glutCreateWindow("Tajmahal");
+ initRendering();
+
+ glutDisplayFunc(drawScene);
+ glutKeyboardFunc(handleKeypress);
+ glutReshapeFunc(handleResize);
+ glutTimerFunc(25, update, 0);
+
+ glutMainLoop();
+ return 0;
+}
+
+
diff --git a/Computer-Graphics-lab-master/Tajmahal_cg/obj/Debug/main.o b/Computer-Graphics-lab-master/Tajmahal_cg/obj/Debug/main.o
new file mode 100644
index 0000000000000000000000000000000000000000..a83c63bbfdbf028971a79a0f3960438095df3c2e
GIT binary patch
literal 76592
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