Merge branch 'master' of warwicknew.xyz:portfolio
This commit is contained in:
commit
33bacd97d1
12 changed files with 239 additions and 34 deletions
|
|
@ -22,6 +22,7 @@
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@material-ui/core": "^4.11.0",
|
"@material-ui/core": "^4.11.0",
|
||||||
|
"@material-ui/icons": "^4.11.2",
|
||||||
"@types/react": "^16.9.56",
|
"@types/react": "^16.9.56",
|
||||||
"fontsource-roboto": "^3.0.3",
|
"fontsource-roboto": "^3.0.3",
|
||||||
"hls.js": "^1.1.5",
|
"hls.js": "^1.1.5",
|
||||||
|
|
|
||||||
|
|
@ -13,34 +13,49 @@ import {
|
||||||
} from "@material-ui/core";
|
} from "@material-ui/core";
|
||||||
import Monq from "../static/images/Monq.jpg";
|
import Monq from "../static/images/Monq.jpg";
|
||||||
import Graphics from "../static/images/Graphics.png";
|
import Graphics from "../static/images/Graphics.png";
|
||||||
|
import NewGraphics from "../static/images/NewGraphics.png";
|
||||||
|
|
||||||
class GameProjects extends Component {
|
class GameProjects extends Component {
|
||||||
constructor(props) {
|
constructor(props) {
|
||||||
super(props);
|
super(props);
|
||||||
this.content = [
|
this.content = [
|
||||||
|
{
|
||||||
|
header: "Current Graphics Project",
|
||||||
|
subheader: "Happening alongside Assistent Lecturer - Falmouth University",
|
||||||
|
image: NewGraphics,
|
||||||
|
imageAltText: "Generated terrain",
|
||||||
|
content: `I'm currently working on a another graphics project as this
|
||||||
|
is the area of computing I want to get back into. I plan on
|
||||||
|
implementing much more complex generated terrain and other features
|
||||||
|
such as including a physics engine for a more complex character
|
||||||
|
controller and an entity system so I can implement other methods of
|
||||||
|
terrain traversal.`,
|
||||||
|
buttonText: "Read Blog",
|
||||||
|
buttonLink: "/graphics-blog",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
header: "Monq",
|
header: "Monq",
|
||||||
subheader: "D-tail Entertainment - Programmer",
|
subheader: "D-tail Entertainment - Programmer",
|
||||||
image: Monq,
|
image: Monq,
|
||||||
imageAltText: "Monq",
|
imageAltText: "Monq",
|
||||||
content: `Technically this was my first attempt at creating a startup with
|
content: `This was my first time working in and creating a startup with
|
||||||
university friends. However we over scoped when it came to having an interesting
|
university friends. I mostly worked on ai aspects of the project as
|
||||||
platformer in a single year when it came to our USP of time mechanics and our
|
well as working on some of the puzzle sections of the game. Though in
|
||||||
artist's great work. This paired with a lack of design and writing put too much
|
the doing it for real indie envirenment I had my hand in pretty much
|
||||||
emphasis on the previously mentioned time mechanics without adequately designed
|
every other programming aspect of the game also.`,
|
||||||
levels to show that off nor create a hook to keep people interested in the game.`,
|
|
||||||
buttonText: "Learn More",
|
buttonText: "Learn More",
|
||||||
buttonLink: "https://d-tail-entertainment.itch.io/monq",
|
buttonLink: "https://d-tail-entertainment.itch.io/monq",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
header: "Graphics",
|
header: "University Graphics Project",
|
||||||
subheader: "Bsc (hons) Computing for Games - Falmouth University",
|
subheader: "Bsc (hons) Computing for Games - Falmouth University",
|
||||||
image: Graphics,
|
image: Graphics,
|
||||||
imageAltText: "Generated terrain",
|
imageAltText: "Generated terrain",
|
||||||
content: `This is where I learned how to create a graphics engine from
|
content: `This is where I learned how to create a graphics engine from
|
||||||
scratch using OpenGL and was the project which I enjoyed the most during my
|
scratch using OpenGL and was the project which I enjoyed the most
|
||||||
bachelors degree. I especially enjoyed how deep I jumped into C++ to improve it's
|
during my bachelors degree. I especially enjoyed how deep I jumped into
|
||||||
memory footprint returning to this project in my final year of university.`,
|
C++ to improve it's memory footprint returning to this project in my
|
||||||
|
final year of university.`,
|
||||||
buttonText: undefined,
|
buttonText: undefined,
|
||||||
buttonLink: undefined,
|
buttonLink: undefined,
|
||||||
},
|
},
|
||||||
|
|
|
||||||
169
src/GraphicsBlog.jsx
Normal file
169
src/GraphicsBlog.jsx
Normal file
|
|
@ -0,0 +1,169 @@
|
||||||
|
import { h, render, Component } from "preact";
|
||||||
|
import {
|
||||||
|
Grid,
|
||||||
|
Container,
|
||||||
|
Card,
|
||||||
|
CardHeader,
|
||||||
|
CardMedia,
|
||||||
|
CardActions,
|
||||||
|
CardContent,
|
||||||
|
Typography,
|
||||||
|
Button,
|
||||||
|
List,
|
||||||
|
ListHeader,
|
||||||
|
ListItemIcon,
|
||||||
|
ListItem,
|
||||||
|
} from "@material-ui/core";
|
||||||
|
import ArrowRightIcon from '@material-ui/icons/ArrowRight';
|
||||||
|
import Header from "./Header";
|
||||||
|
|
||||||
|
import Blog1 from "../static/images/GraphicsBlog/blog1.png";
|
||||||
|
const Blog2 = new URL("../static/video/graphics_blog/blog2.webm", import.meta.url);
|
||||||
|
import Blog3 from "../static/images/GraphicsBlog/blog3.png";
|
||||||
|
|
||||||
|
class GraphicsBlog extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props);
|
||||||
|
this.content = [
|
||||||
|
{
|
||||||
|
header: "SDL/OpenGL boilerplate",
|
||||||
|
subheader: "Note: this blog is a copy of a forum thread",
|
||||||
|
mediaType: "img",
|
||||||
|
image: Blog1,
|
||||||
|
imageAltText: "Textured square",
|
||||||
|
content: `Today I added textures to my game engine. Next up
|
||||||
|
refactoring... But then camera movement (Or strangely enough world
|
||||||
|
movement around camera).`,
|
||||||
|
buttonText: undefined,
|
||||||
|
buttonLink: undefined,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: "Camera Movement",
|
||||||
|
subheader: "Note: this blog is a copy of a forum thread",
|
||||||
|
mediaType: "video",
|
||||||
|
image: Blog2,
|
||||||
|
imageAltText: "Textured square with camera movement",
|
||||||
|
content: `The project is now officially 3D, with camera movement. Next
|
||||||
|
up is more complex meshes.`,
|
||||||
|
buttonText: undefined,
|
||||||
|
buttonLink: undefined,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
header: "Multiple Meshes",
|
||||||
|
subheader: "Note: this blog is a copy of a forum thread",
|
||||||
|
mediaType: "img",
|
||||||
|
image: Blog3,
|
||||||
|
imageAltText: "2 textured squares",
|
||||||
|
content: `Now I have a mesh class it's pretty easy to make multiple
|
||||||
|
objects reusing textures and indecies. Next it's giving those meshes
|
||||||
|
their own relative position rather than hard coding every position on
|
||||||
|
every triangle point to move it 🙃.`,
|
||||||
|
buttonText: undefined,
|
||||||
|
buttonLink: undefined,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
render = () => {
|
||||||
|
return (
|
||||||
|
<span>
|
||||||
|
<Header />
|
||||||
|
<Container>
|
||||||
|
<p />
|
||||||
|
<Card>
|
||||||
|
<CardHeader title="Graphics Blog" />
|
||||||
|
<CardContent>
|
||||||
|
<Typography variant="p" >
|
||||||
|
In this project I plan to generate a cyberpunk cityscape with
|
||||||
|
an infinite level of verticality to really give it a large
|
||||||
|
sense of scale.
|
||||||
|
</Typography>
|
||||||
|
<List dense>
|
||||||
|
<ListHeader>
|
||||||
|
To Do:
|
||||||
|
</ListHeader>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Give meshes their own relative location.
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Run a marching square implementation to generate a mesh for a
|
||||||
|
chunk based on test data.
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Handle loading chunks asynchrounously as the game runs.
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Add a noise algorithm to vary the city scape marching square
|
||||||
|
generation.
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Create mesh data library to make the marching square
|
||||||
|
algorithm generate something that looks like a city.
|
||||||
|
(May require a method of importing models)
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Fancy lighting (Potentially bake some shadows into a chunks
|
||||||
|
tuxture during the generaton phase).
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Design and create an interesting movement system for the world created.
|
||||||
|
</ListItem>
|
||||||
|
<ListItem>
|
||||||
|
<ListItemIcon><ArrowRightIcon /></ListItemIcon>
|
||||||
|
Look into potential implementation of mono-rails and
|
||||||
|
suspended trains as a stretch goal.
|
||||||
|
</ListItem>
|
||||||
|
</List>
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
<p />
|
||||||
|
<Grid container spacing={3}>
|
||||||
|
{this.content.reverse().map((project) => {
|
||||||
|
return (
|
||||||
|
<Grid item xs="12" lg="6">
|
||||||
|
<Card>
|
||||||
|
<CardHeader
|
||||||
|
title={project.header}
|
||||||
|
subheader={project.subheader}
|
||||||
|
/>
|
||||||
|
<CardMedia
|
||||||
|
component={project.mediaType}
|
||||||
|
image={project.image}
|
||||||
|
alt={project.imageAltText}
|
||||||
|
muted
|
||||||
|
loop
|
||||||
|
autoplay
|
||||||
|
controls
|
||||||
|
/>
|
||||||
|
<CardContent>
|
||||||
|
<Typography variant="body1" >
|
||||||
|
{project.content}
|
||||||
|
</Typography>
|
||||||
|
</CardContent>
|
||||||
|
<CardActions>
|
||||||
|
<Button
|
||||||
|
target="_blank"
|
||||||
|
href={project.buttonLink}
|
||||||
|
color="primary"
|
||||||
|
>
|
||||||
|
{project.buttonText}
|
||||||
|
</Button>
|
||||||
|
</CardActions>
|
||||||
|
</Card>
|
||||||
|
</Grid>
|
||||||
|
);
|
||||||
|
})}
|
||||||
|
</Grid>
|
||||||
|
</Container>
|
||||||
|
</span>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
export default GraphicsBlog;
|
||||||
|
|
@ -29,14 +29,23 @@ class Header extends Component {
|
||||||
<Typography style={{ flex: 1 }}>Warwick New</Typography>
|
<Typography style={{ flex: 1 }}>Warwick New</Typography>
|
||||||
</Link>
|
</Link>
|
||||||
<Box />
|
<Box />
|
||||||
|
<span style={{ marginLeft: "auto" }} >
|
||||||
|
<Button
|
||||||
|
variant="contained"
|
||||||
|
href="/graphics-blog"
|
||||||
|
color="secondary"
|
||||||
|
>
|
||||||
|
Graphics Blog
|
||||||
|
</Button>
|
||||||
|
{" "}
|
||||||
<Button
|
<Button
|
||||||
variant="contained"
|
variant="contained"
|
||||||
href="/contact"
|
href="/contact"
|
||||||
color="secondary"
|
color="secondary"
|
||||||
style={{ marginLeft: "auto" }}
|
|
||||||
>
|
>
|
||||||
Contact Me
|
Contact Me
|
||||||
</Button>
|
</Button>
|
||||||
|
</span>
|
||||||
</Toolbar>
|
</Toolbar>
|
||||||
</AppBar>
|
</AppBar>
|
||||||
);
|
);
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ class Home extends Component {
|
||||||
<Container maxWidth="md">
|
<Container maxWidth="md">
|
||||||
<WebProjects />
|
<WebProjects />
|
||||||
</Container>
|
</Container>
|
||||||
|
<p />
|
||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -15,32 +15,38 @@ class Ramble extends Component {
|
||||||
return (
|
return (
|
||||||
<span>
|
<span>
|
||||||
<Header />
|
<Header />
|
||||||
|
<p />
|
||||||
<Container maxWidth="md">
|
<Container maxWidth="md">
|
||||||
|
|
||||||
<Card>
|
<Card>
|
||||||
<CardHeader title="Ramble" />
|
<CardHeader title="Ramble" />
|
||||||
<CardContent>
|
<CardContent>
|
||||||
<Typography varient="p">
|
<Typography varient="p">
|
||||||
Ramble was a web project I created during my masters to try to
|
Ramble was a web project I created during my master's degree to
|
||||||
create a startup.
|
create a startup. In this project I acted as CTO and built a
|
||||||
|
website that allowed users to stream their podcasts live and
|
||||||
|
accept call ins in a similar vain to talk shows! I learnt the
|
||||||
|
entire javascript web development stack from react to audio
|
||||||
|
streaming to devops in order to make it a reality.
|
||||||
</Typography>
|
</Typography>
|
||||||
<p />
|
<p />
|
||||||
<Typography varient="p">
|
<Typography varient="p">
|
||||||
It was essentially a website with chatroom functionality with
|
It also chatroom functionality with the ability to re-stream to
|
||||||
the ability to re-stream to audiences much like other apps that
|
audiences much like other apps that came out in the time since,
|
||||||
came out in the time since, such as clubhouse. These high
|
such as clubhouse.
|
||||||
profile alternatives to our product destroyed any forst to
|
|
||||||
market advantage we may have had slready secured a lot of
|
|
||||||
funding which we failed to procure leading us to choose to
|
|
||||||
abandon the project.
|
|
||||||
</Typography>
|
</Typography>
|
||||||
<p />
|
<p />
|
||||||
<Typography varient="p">
|
<Typography varient="p">
|
||||||
Due to the projects reliance on software as a service projects
|
During the project's lifespan of just under two years, I acted
|
||||||
and it's part ownership of an incubator program, I'm
|
as CTO. I mostly worked on creating the streaming functionality
|
||||||
unfortunately unable to leave a demo running of the
|
of the project and managing how the project was designed to
|
||||||
functionality we had created. So here's a video of it in action
|
function behind the hood when it was deployed. I learned a ton
|
||||||
I took just before the shutoff.
|
about how web deployment works during this time allowing me to
|
||||||
|
work on web development modules in the Games Academy at
|
||||||
|
Falmouth University today.
|
||||||
|
</Typography>
|
||||||
|
<p />
|
||||||
|
<Typography varient="p">
|
||||||
|
Here's a demo of the project I took before before we moved on.
|
||||||
</Typography>
|
</Typography>
|
||||||
<p />
|
<p />
|
||||||
<div>
|
<div>
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,10 @@ class App extends Component {
|
||||||
import("./Ramble").then((module) => module.default)
|
import("./Ramble").then((module) => module.default)
|
||||||
}
|
}
|
||||||
/>
|
/>
|
||||||
|
<AsyncRoute path="/graphics-blog" getComponent={() =>
|
||||||
|
import("./GraphicsBlog").then((module) => module.default)
|
||||||
|
}
|
||||||
|
/>
|
||||||
<AsyncRoute default getComponent={() =>
|
<AsyncRoute default getComponent={() =>
|
||||||
import("./404Page").then((module) => module.default)
|
import("./404Page").then((module) => module.default)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,7 @@ const theme = createTheme({
|
||||||
main: '#046865',
|
main: '#046865',
|
||||||
},
|
},
|
||||||
background: {
|
background: {
|
||||||
default: '#f8ffeb',
|
default: '#f0ffd6',
|
||||||
},
|
},
|
||||||
error: {
|
error: {
|
||||||
main: '#e53d00',
|
main: '#e53d00',
|
||||||
|
|
|
||||||
BIN
static/images/GraphicsBlog/blog1.png
Normal file
BIN
static/images/GraphicsBlog/blog1.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 126 KiB |
BIN
static/images/GraphicsBlog/blog3.png
Normal file
BIN
static/images/GraphicsBlog/blog3.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 215 KiB |
BIN
static/images/NewGraphics.png
Normal file
BIN
static/images/NewGraphics.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 152 KiB |
BIN
static/video/graphics_blog/blog2.webm
Normal file
BIN
static/video/graphics_blog/blog2.webm
Normal file
Binary file not shown.
Loading…
Reference in a new issue